我有一对一的关系,但是hibernatetool在生成模式时提示。这是显示问题的示例:
@Entity
public class Person {
@Id
public int id;
@OneToOne
public OtherInfo otherInfo;
rest of attributes ...
}
人与OtherInfo具有一对一关系:
@Entity
public class OtherInfo {
@Id
@OneToOne(mappedBy="otherInfo")
public Person person;
rest of attributes ...
}
人是OtherInfo的拥有方。 OtherInfo是所有者,因此person使用
mappedBy
在Person中指定属性名称“otherInfo”。使用hibernatetool生成数据库架构时出现以下错误:
org.hibernate.MappingException: Could not determine type for: Person, at table: OtherInfo, for columns: [org.hibernate.mapping.Column(person)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:175)
at org.hibernate.cfg.Configuration.iterateGenerators(Configuration.java:743)
at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:854)
at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:128)
...
知道为什么吗?我是在做错什么,还是这是 hibernate 错误?
最佳答案
JPA不允许在OneToOne或ManyToOne映射上使用@Id批注。您想要做的是与共享主键进行一对一的实体关联。最简单的情况是使用共享 key 的单向一对一:@Entity
public class Person {
@Id
private int id;
@OneToOne
@PrimaryKeyJoinColumn
private OtherInfo otherInfo;
rest of attributes ...
}
这样做的主要问题是JPA不支持OtherInfo实体中共享主键的生成。经典书籍Java Persistence with Hibernate by Bauer and King使用Hibernate扩展为问题提供了以下解决方案:@Entity
public class OtherInfo {
@Id @GeneratedValue(generator = "customForeignGenerator")
@org.hibernate.annotations.GenericGenerator(
name = "customForeignGenerator",
strategy = "foreign",
parameters = @Parameter(name = "property", value = "person")
)
private Long id;
@OneToOne(mappedBy="otherInfo")
@PrimaryKeyJoinColumn
public Person person;
rest of attributes ...
}
另外,请参见here。