我正在使用:
春天3.2
Hibernate 4.1.9
我需要用JPA映射三个类。 A类与B类具有ManyToMany关系.A类和B类的独特组合需要拥有C类集合。
表A
foo
id | name
表B
bar
id | name
表C
data
id | xrefId
加入表 - 唯一键(fooId,barId)
xref
id | fooId | barId
不能改变现有的数据结构。
编辑1:
目标:加载一个Foo,获取它的Bars集合。从每个Bar获取其(他们的!)数据集合。
A类
@Entity
public class Foo {
@Id
private UUID id;
@ManyToMany(optional = false)
@JoinTable(name = "xref",
joinColumns = { @JoinColumn(name = "fooId") },
inverseJoinColumns = { @JoinColumn(name = "barId") })
private List<Bar> lstBar = new ArrayList<Bar>();
}
B类
public class Bar {
@Id
private UUID id;
@ManyToMany(mappedBy = "lstBar")
private List<Foo> lstFoo = new ArrayList<Foo>();
}
C类
public class Data {
@Id
private UUID id;
}
答案 0 :(得分:0)
您的联接表xref
有一个额外的id
字段,为了能够使用JPA创建这样的表,您需要一个额外的实体类XRef
然后您拥有映射A
和XRef
之间的关系以及B
和XRef
之间的关系(两者都是一对多)。然后,您可以创建实体类C
并映射C
和XRef
之间的关系。你需要更多帮助吗?我现在没有时间提供代码,但如果您需要提问,我会尽快添加。
答案 1 :(得分:0)
看一下这个例子(为简单起见,使用Integer而不是UUID,其余的应该没问题)。
酒吧类:
public class Bar {
@Id
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "barId")
private Collection<Xref> xrefCollection;
}
Foo类:
public class Foo {
@Id
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "fooId")
private Collection<Xref> xrefCollection;
}
外部参照类:
public class Xref {
@Id
private Integer id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "xrefId")
private Collection<Data> dataCollection;
@JoinColumn(name = "bar_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Bar barId;
@JoinColumn(name = "foo_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Foo fooId;
}
数据类:
public class Data {
@Id
private Integer id;
@JoinColumn(name = "xref_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Xref xrefId;
}
此代码为automatically generated by NetBeans,前提是所有表和索引都在DB中正确定义