Hibernate Annotations创建关系

时间:2013-05-29 04:00:21

标签: database spring hibernate annotations

我有3个类,一个超类和两个子类。每个子类都有另一个子类的集合,我想映射它们之间的一对多关系。我的超类是person,子类称为referrer和broker。我想要表达的关系是,一个推荐人可以拥有多个经纪人,而且一个经纪人可以拥有多个推荐人。

@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的主键应该是一个名为rowID的字段,该字段包含在Person超类中。

我真的被卡住了,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

最后,您所拥有的是ManyToMany关系。除了一个问题,你使用连接表吗?看起来就像这样。 Basicaly你尝试的是这个:

   @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")。但我不得不承认,我不知道如何使用基本相同的列进行双面映射。所以请随时告诉我这件事。

答案 1 :(得分:1)

如果Broker的主键是Person,那么我的方法就是这个

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

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

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

  4. 引入另一个具有两列(当然具有不同名称)的中间表,两个表(Broker和Referrer)的复合PK。对Broker(和Referrer)使用多对多关系,并在中间表上的各个PK列上加入。