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
之间的关系,以及m
B
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