JPA Mapping - 每个孩子的父母的独特组合

时间:2013-01-15 16:13:04

标签: java hibernate jpa

我正在使用:
春天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;
}

2 个答案:

答案 0 :(得分:0)

您的联接表xref有一个额外的id字段,为了能够使用JPA创建这样的表,您需要一个额外的实体类XRef然后您拥有映射AXRef之间的关系以及BXRef之间的关系(两者都是一对多)。然后,您可以创建实体类C并映射CXRef之间的关系。你需要更多帮助吗?我现在没有时间提供代码,但如果您需要提问,我会尽快添加。

答案 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中正确定义