【问题标题】:Hibernate Annotations to create relationship休眠注释以创建关系
【发布时间】:2013-05-24 04:54:40
【问题描述】:

我有 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 的字段。

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

【问题讨论】:

    标签: database spring hibernate annotations


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案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")。但我不得不承认,我不知道使用基本相同的列在两侧进行映射会如何。所以请让我知道它的工作原理。

      【讨论】:

      • 我最终使用了一个连接表,并在连接表中进行了一对多然后多对一。所以经纪人和推荐人都有一个一对多,然后在我的连接表中都有一个多对一。它似乎工作。我希望。
      • 这种映射通常在连接表中有附加列时完成。如果连接表只有两列(Broker 的 Pk,Referrer),那么它就在头顶。 stackoverflow.com/questions/5127129/… 无论如何它是你的选择,但只是说对于映射到连接表的实体来说管理 crud 是不必要的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2011-12-05
      • 2017-06-23
      • 2013-12-26
      相关资源
      最近更新 更多