我有一张坚固的 table 。
我有一个弱表,它与强表具有一对一的关系。实际上这是 0 到 1 的关系,因为强表并不总是有弱表中的一行。识别这个弱表只需强表的Id即可。
最后我有另一个弱表,与第一个弱实体具有 ManyToOne 关系。它需要OneToOneWeakEntity的id(也就是强表的id)和他自己的id。这就像 OneToOneWeakTable 的历史。
我想在 Hibernate 中映射,但我不知道该怎么做。
现在我有以下代码:
@Entity
@Table(name="table")
public class Table {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id_table")
private Integer idTable;
private String otherAtributes;
....
}
@Entity
@Table(name="oneToOneWeakTable")
public class OneToOneWeakEntity {
@OneToOne(cascade = CascadeType.ALL, optional=false)
@Id
@JoinColumn(name="table_id_table")
private Table table;
private String otherAtributes;
....
}
@Entity
@Table(name="oneToManyWeakTable")
@IdClass(EntityPk.class)
public class OneToManyWeakTable {
@Id
@ManyToOne
@JoinColumn(name="table_id_table")
private OneToOneWeakEntity oneToOneWeakEntity;
@Id
@Column(name="own_id")
private String ownId;
private String otherAtributes;
....
}
class EntityPk {
@Id
@ManyToOne
@JoinColumn(name="table_id_table")
private OneToOneWeakEntity oneToOneWeakEntity;
@Id
@Column(name="own_id")
private String ownId;
private String otherAtributes;
....
}
我的问题是当我尝试运行我的应用程序时,因为我遇到了此部署错误:
Caused by: org.hibernate.AnnotationException: A Foreign key refering package.OneToOneWeakEntity from package.OneToManyWeakTable has the wrong number of column. should be 0
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:502)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:117)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1518)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1422)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
如何映射这种关系?
谢谢!
编辑:我也尝试用它来映射 OneToOneWeakTable:
@OneToOne(cascade = CascadeType.ALL, optional=false)
@PrimaryKeyJoinColumn
@Id
@JoinColumn(name="table_id_table")
private Table table;
在这种情况下,我在尝试部署时也遇到了错误,但出现了不同的异常:
Caused by: java.lang.NullPointerException
at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:568)
at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:258)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1518)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1422)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
最佳答案
您不必重复 EntityPK
类中的注释,只需匹配表示 OneToManyWeakTable
复合键的简单原始属性,您应该得到像这样的东西(注意 insertable
和 updatable
属性,修改关联没有意义,因为它是实体实例 pk 的一部分),
@Entity
@Table(name="oneToManyWeakTable")
@IdClass(EntityPk.class)
public class OneToManyWeakTable {
@Id
@Column(name="table_id_table")
private long weakEntity
@ManyToOne
@JoinColumn(name="table_id_table", insertable=false, updatable=false)
private OneToOneWeakEntity oneToOneWeakEntity;
@Id
@Column(name="own_id")
private String ownId;
private String otherAtributes;
....
}
class EntityPk {
private long weakEntity;
private String ownId;
....
}
@Entity
@Table(name="oneToOneWeakTable")
public class OneToOneWeakEntity {
@OneToOne
@Id
@JoinColumn(name="table_id_table")
private Table table;
private String otherAtributes;
....
}
另请查看一些 official doc of compound primary keys
编辑: 添加 OneToOneWeakTable
假设您使用的是 JPA 2,在编辑中您正在混合注释。检查共享实体的 id 字段和属性,必须是相同的类型(请注意,我使用 long
作为weakEntity 属性只是作为示例)。
关于java - 如何映射弱实体 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883411/