【发布时间】:2011-12-23 13:19:20
【问题描述】:
我有一个类似于@ManyToMany without join table (legacy database) 的问题,还有一个问题。
我有两张桌子A 和B
-
A具有多列主键(ID和ID2) -
B具有多列主键(ID和ID3)
A 中的一行可以引用B (B.ID = A.ID) 中的多行,B 中的一行可以被A 中的多行引用。
EDIT:数据库是只读的旧数据库,我无法更改。我不需要映射与 JPA 的关系(我可以在我的程序逻辑中使用额外的选择来完成),但这会很好。
它基本上是一个没有连接表的多对多关系。由于对于链接的问题,我只需要阅读表格,因此我尝试在两个类中使用两个一对多的关系。
我遇到的另一个问题是用于连接的两个IDs 都不是主键。
我有以下课程:
@Entity
@Table( name = "A" )
@IdClass( PrimaryKeysA.class )
public class A {
@Id
@Column( name = "ID", insertable = false, updatable = false, columnDefinition = "char" )
private String id;
@Id
@Column( name = "ID2", insertable = false, updatable = false )
private int id2;
@OneToMany( cascade = CascadeType.ALL )
@JoinColumn( name = "ID", columnDefinition = "char", referencedColumnName = "ID" )
private Set< B > setOfBs;
}
@Entity
@Table( name = "B" )
@IdClass( PrimaryKeysB.class )
public class B {
@Id
@Column( name = "ID", insertable = false, updatable = false, columnDefinition = "char" )
private String id;
@Id
@Column( name = "ID3", insertable = false, updatable = false )
private int id3;
@OneToMany( cascade = CascadeType.ALL )
@JoinColumn( name = "ID", columnDefinition = "char", referencedColumnName = "ID" )
private Set< A > setOfAs;
}
Hibernate 产生以下错误:
Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
我没有真正得到消息:B.id 正在引用 A (A.id) 中的单个属性。
编辑:根据要求:
public class PrimaryKeysA implements Serializable {
private static final long serialVersionUID = 1L;
private int id1;
private int id2;
// getters/setters/equals/hashcode
}
PrimaryKeysB 类似于 id3 而不是 id2。 A 和 B 两个类都是简化(匿名)示例。
【问题讨论】:
-
我真的不明白这些表如何实现多对多。 A.ID 引用 B.ID,B.ID 是 B 的主键。所以一个给定的 A 只能引用一个 B。你只有一个从 A 到 B 的 ManyToOne 关联。
-
哎呀抱歉,我在 A 上的情况与在 B 上的情况相同。我将编辑问题(我试图生成一个过于简单的示例)
-
这不是两个表之间的多对多关联...为什么在每个表上使用两个 id?您是否有能力将此模式更改为更标准的形式,或者这是一个遗留数据库?如果它不是遗留数据库,如果您想要多对多关联,您不使用连接表的原因是什么?
-
@joncarl 不,它是一个旧的只读数据库。否则我会选择更好的设计。我也可以避免关系的映射,只定义实体。我想尝试将其映射到能够避免多次选择。
-
@joncarl,实际上是多对多关联。每个 A 有几个相关的 B,每个 B 有几个 A。设计很糟糕,但在语义上它是一个多对多的关联。