-1

我有 3 个类,一个超类和两个子类。每个子类都有另一个子类的集合,我想映射它们之间的一对多关系。我的超类是person,子类称为referrer和broker。我想表达的关系是一个referrer可以有很多broker,一个broker可以有很多referrer。

@Component
@Entity
@Table(name="Referrer")
@PrimaryKeyJoinColumn(name="rowID")
public class Referrer extends Person implements Serializable{

    private static final long serialVersionUID = 972571370198603227L;

    @Column(name="rowId")
    private String referrerID;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn
    private List<Broker> brokers = new ArrayList<Broker>();

经纪人看起来像这样:

@Component
@Entity
@Table(name="Broker")
@PrimaryKeyJoinColumn(name="rowID")
public class Broker extends Person implements Serializable {

    private static final long serialVersionUID = 5648239413711716027L;

    @Column(name="AdminID", nullable=true)
    private String adminID;

    @Column
    private boolean isAdmin = false;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="referrer")
    private List<Referrer> referrers = new ArrayList<Referrer>();

Broker 的主键应该是包含在 Person 超类中的名为 rowID 的字段。

我真的被困住了,所以任何帮助将不胜感激。

4

2 回答 2

2

最后,你在这里拥有的是一种ManyToMany关系。撇开一个问题不谈,您使用的是连接表吗?看起来就是这样。基本上你尝试的是这样的:

   @ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(
           name = "jointablename",
           joinColumns = @JoinColumn(name = "FlexRowId"), 
           inverseJoinColumns = @JoinColumn(name = "FlexRowId")
         )
private List<Referrer> referrers = new ArrayList<Referrer>();

基本上这就是您需要在两个实体中添加的内容。可能你可以省略@PrimaryKeyJoinColumn(name="FlexRowID"). 但我不得不承认,我不知道使用基本相同的列在两侧进行映射会如何。所以请让我知道它的工作原理。

于 2013-05-29T06:43:38.310 回答
1

如果 Broker 的主键是在 Person 那么我的方法是这样的

  1. 在 Person 和 Broker 之间定义一对一的连接关系,每个都有自己的表

  2. 在 Broker 的外部 ID 生成器中使用 Person 的 PK(使其成为双向的,以便级联工作正常)

  3. 对 Referrer 重复相同的操作(它有自己的表)

  4. 引入另一个中间表,其中包含两个表(Broker 和 Referrer)的两列(当然名称不同)组合 PK。对代理(和推荐人)使用多对多关系,并在中间表的各个 PK 列上加入。

于 2013-05-29T11:34:18.797 回答