Java JPA 2.1/Hibernate 5.0生成模式时会忽略inverseJoinColumn中的foreignKey名称
我尝试用JPA2.1和Hibernate 5.0生成DDL,但不知何故,我做了一些错误的事情,它忽略了Java JPA 2.1/Hibernate 5.0生成模式时会忽略inverseJoinColumn中的foreignKey名称,java,hibernate,jpa,ddl,Java,Hibernate,Jpa,Ddl,我尝试用JPA2.1和Hibernate 5.0生成DDL,但不知何故,我做了一些错误的事情,它忽略了inverseJoinColumn定义中foreignkey的名称 这些是我的实体: 家长: @Entity @Table(name = "PARENT", indexes = { @Index(columnList = "NAME", name = "IDX_NAME") }, uniqueConstraints = { @UniqueConstraint(columnNames = "NAM
inverseJoinColumn
定义中foreignkey的名称
这些是我的实体:
家长:
@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<>();
}
我编写了以下小的主类来生成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>
org.hibernate.jpa.HibernatePersistenceProvider
nl.generate.ddl.example.Child
nl.generate.ddl.example.Parent
有人能给我指出正确的方向吗?
我在github上的一个示例项目中包含了上面的代码,实际上元数据中有一个不正确的地方,那就是在
@JoinTable
上有一个“inverseFormeKey”。在此处指定FK信息,而不是在“inverseJoinColumns”下
JPA模式注释在我看来都很好,唯一的例外是一些数据存储会反对名称为“IDX_name”(一个在父级,一个在子级)的多个索引,因为它们的名称空间是全局的。如果您的JPA提供商没有选择FK名称,则在其上提出一个bug。谢谢您的回复。我更改了示例项目中的索引名。我知道在Hibernate4中有一些bug与此相关,但我也读到他们关闭了这些票据,并将它们标记为在Hibernate5中已解决。我也会把它带去冬眠。
<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>
@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") })