gpt4 book ai didi

java - JPA 2.1/Hibernate 5.0 生成模式忽略 inverseJoinColumn 中的 foreignKey 名称

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:54 29 4
gpt4 key购买 nike

我尝试使用 JPA 2.1 和 Hibernate 5.0 生成 DDL,但不知何故我做错了,它忽略了 inverseJoinColumn 定义中的外键名称。

这些是我的实体:

家长:

@Entity
@Table(name = "PARENT", indexes = { @Index(columnList = "NAME", name = "IDX_NAME") }, uniqueConstraints = { @UniqueConstraint(columnNames = "NAME", name = "UK_NAME") })
@SequenceGenerator(allocationSize = 1, name = "PARENT_ID_GENERATOR", sequenceName = "PARENT_ID_SEQ")
public class Parent {

@Id
@GeneratedValue(generator = "PARENT_ID_GENERATOR", strategy = SEQUENCE)
@Column(name = "ID")
private Long id;

@Column(name = "NAME")
private String name;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "PARENT_CHILD", joinColumns = @JoinColumn(name = "PARENT_ID"), foreignKey = @ForeignKey(name ="FK_PARENT_CHILD_PARENT"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID", foreignKey = @ForeignKey(name ="FK_ABC")), uniqueConstraints = {@UniqueConstraint(columnNames = "CHILD_ID", name = "UK_CHILD_ID") })
private List<Child> children = new ArrayList<>();

}

child :

@Entity
@Table(name = "CHILD", indexes = { @Index(columnList = "NAME", name = "IDX_NAME") }, uniqueConstraints = { @UniqueConstraint(columnNames = "NAME", name = "UK_NAME") })
@SequenceGenerator(allocationSize = 1, name = "CHILD_ID_GENERATOR", sequenceName = "CHILD_ID_SEQ")
public class Child {

@Id
@GeneratedValue(generator = "CHILD_ID_GENERATOR", strategy = SEQUENCE)
@Column(name = "ID")
private Long id;

@Column(name = "NAME")
private String name;
}

我写了下面的小主类来生成ddl

架构创建者:

public class SchemaCreator {

public static void main(String[] args) throws IOException {
execute("default", "./target/create.sql");
System.exit(0);
}

public static void execute(String persistenceUnitName, String destination) {
System.out.println("Generating DDL create script to : " + destination);

final Properties persistenceProperties = new Properties();

persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO, "");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none");

persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_ACTION, "create");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SOURCE, "metadata");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_CREATE_TARGET, destination);
persistenceProperties.setProperty(AvailableSettings.JDBC_DRIVER,"org.h2.Driver");
persistenceProperties.setProperty(AvailableSettings.JDBC_URL,"jdbc:h2:mem:jpaschema");
Persistence.generateSchema(persistenceUnitName, persistenceProperties);
}

}

我的 persistence.xml 看起来像这样

坚持

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="default">

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

<class>nl.generate.ddl.example.Child</class>
<class>nl.generate.ddl.example.Parent</class>
</persistence-unit>

有人能指出我正确的方向吗?我将上述代码包含在 github 上的示例项目中 https://github.com/vdmc/generate-ddl-example.git

最佳答案

实际上,您的元数据中不正确的一件事是 @JoinTable 上有 “inverseForeignKey”。在那里而不是在 “inverseJoinColumns” 下指定您的 FK 信息。

@JoinTable(name = "PARENT_CHILD", 
joinColumns = @JoinColumn(name = "PARENT_ID"),
foreignKey = @ForeignKey(name ="FK_PARENT_CHILD_PARENT"),
inverseJoinColumns = @JoinColumn(name = "CHILD_ID"),
inverseForeignKey = @ForeignKey(name ="FK_ABC"),
uniqueConstraints = {@UniqueConstraint(columnNames = "CHILD_ID", name = "UK_CHILD_ID") })

关于java - JPA 2.1/Hibernate 5.0 生成模式忽略 inverseJoinColumn 中的 foreignKey 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174816/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com