如何在 hibernate 3 中映射派生身份?
-
26-09-2019 - |
题
我有以下情况:
@Entity
class A{
@Id
@SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
private Long aId;
@OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
private B b;
...
}
@Entity
class B{
@Id
private A a;
...
}
换句话说:A 和 B 之间存在一对一关联。B是弱实体,其Id源自类A。
我已经测试了一些解决方案,如在 @OneToOne 下添加 @PrimaryKeyJoinColumn ,如下所示 文章 提到。但我收到了这个错误:“org.hibernate.id.IdentifierGenerationException:在调用 save() 之前必须手动分配此类的 ids:乙”
我不知道这是否与本例相关,但我正在使用 Oracle 11g。
更新
我想我的方式是正确的。这是我的问题的实际状态:
@Entity
class A{
@Id
@SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
private Long aId;
@OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn(name="aId")
private B b;
...
}
@Entity
class B{
@Id
@OneToOne
@JoinColumn(name="aId)
private A a;
...
}
现在的错误有点不同:
java.sql.SQLException: ORA-00904: "B"."A": invalid identifier
它试图在表 B 中查找列 A(而不是 AID)。我不知道如何指定列名是 B.AID 而不是 B.A。
解决方案
我按照这个解决了我的问题 关联
正确的答案是:
@Entity
public class A {
@Id
@GeneratedValue
@Column(name = "aId")
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
private B b;
...
}
@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {
@Id
@GeneratedValue(generator = "a-primarykey")
@Column(name = "aId")
private Long id;
@OneToOne
@PrimaryKeyJoinColumn
private A a;
...
}
其他提示
你在实体B上尝试过这个吗?
@Entity class B {
@Id @OneToOne
@JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
private A a;
....
}
不隶属于 StackOverflow