Java JPA映射-每个孩子的父母的唯一组合
我正在使用:Java JPA映射-每个孩子的父母的唯一组合,java,hibernate,jpa,Java,Hibernate,Jpa,我正在使用: 弹簧3.2 休眠4.1.9 我需要用JPA映射三个类。类别A与类别B之间有许多关系。类别A和类别B的独特组合需要拥有类别C的集合 表A foo id | name @Entity public class Foo { @Id private UUID id; @ManyToMany(optional = false) @JoinTable(name = "xref", joinColumns =
弹簧3.2
休眠4.1.9 我需要用JPA映射三个类。类别A与类别B之间有许多关系。类别A和类别B的独特组合需要拥有类别C的集合 表A
foo
id | name
@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
bar
id | name
public class Bar {
@Id
private UUID id;
@ManyToMany(mappedBy = "lstBar")
private List<Foo> lstFoo = new ArrayList<Foo>();
}
表C
data
id | xrefId
连接表——打开唯一键(fooId,barId)
改变现有的数据结构不是一种选择
编辑1:
目标:加载一个Foo,获取它的条集合。从每个栏中,获取它(他们!)的数据集合
A类
foo
id | name
@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>();
}
只是亲吻。创建另一个类Xref,其中包含
id
、foo
、bar
和Set
字段。使用两个参数foo
和bar
(使用简单的HQL实现)创建一个DAO方法来查找外部参照。唯一的需求可以通过数据库中的唯一约束来实现
仅仅通过类层次结构来表达它看起来不太好,最好使用DAOs。您的联接表,
xref
,有一个额外的id
字段,为了能够使用JPA创建这样一个表,您需要一个额外的实体类XRef
,然后必须映射a
和XRef
之间的关系,以及mB
和XRef
之间的关系(两者都是一对多)。然后,您可以创建实体类C
,并映射C
和XRef
之间的关系。你需要更多的帮助吗?我现在没有时间提供代码,但是如果您需要询问,我会尽快添加代码。看看这个示例(为了简单起见,使用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;
}
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;
}
如果在DB中正确定义了所有表和索引,那么这段代码已经存在,那么您已经取得了多少进展?你能给我们看一些你需要帮助的代码吗?我已经添加了我目前所在的位置。我不知道在哪里/如何将C类(“数据”)与Foo/Bar的独特组合联系起来。谢谢。这很有效。我试图避免这种情况,但这是我能想到的唯一答案。事实上,它在这里(两次,甚至两次)强化了这一点。这个答案与前面的答案相同。我知道你们必须在几秒钟内提交。并不是说其中一个比另一个更正确或更不正确……我必须“接受”另一个,因为这是第一个。没问题,迈克!当我提交我的答案时,菅直人的答案已经存在了:D