Hibernate中的关联类映射

时间:2014-05-21 10:10:34

标签: java hibernate mapping

我是学生,我是Hibernate框架的新手,我有一个关联类 我想知道如何映射它 情况:

         Entity_1[0..\*]-------------------------[0..\*]Entity_2

                                 |
                                 |
                                 |
                                 |
                                 |
                          Association class
                           Date_affectation
                           Date_expiration

我应该使用哪种关联规则?

2 个答案:

答案 0 :(得分:1)

您可以将关联建模为单独的Association实体。时态数据可以建模为常规Date属性(如@Temporal(TemporalType.TIMESTAMP))。

您可以将关联的PK建模为Entity_1Entity_2的外键的组合 - 这将使关联成为依赖实体。或者您可以为其指定一个自己的ID,并通过ManyToOne关系连接到Entity_1Entity_2

编辑:我的示例实现的大部分是从@ Vlad的答案中无耻地被盗,因为主要区别在于实体具有id且可查询而嵌入不是。

我已从“日期”列中删除了@Column(updatable=false),因为我不确定这是否是必需的并添加了@Temporal(TemporalType.TIMESTAMP),因为它是required by the JPA spec,从而提高了可移植性。

由于这是一个双向映射,我在反面(实体)使用mappedBy而不是在拥有方(关联)上使用JoinColumn

@Entity
public class Association {

  @Id
  @GeneratedValue(...)
  private Long id;

  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private Date affectation;

  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private Date expiration;

  @ManyToOne(fetch=FetchType.LAZY)
  private Entity1 entity1;

  @ManyToOne(fetch=FetchType.LAZY)
  private Entity2 entity2;
}

Entity1和Entity2看起来一样,只需替换数字。我不确定使用Set界面的附加值,所以我用List替换它,但也许我错过了一些东西。

public class Entity1 {

  @OneToMany(mappedBy="entity1")
  private List<Association> associations = new ArrayList<Association>();
  ...
}

答案 1 :(得分:0)

除非您想要通过其ID获取关联,否则您应该选择具有可定义这两个日期字段的Embeddable Association。

@Embeddable
public class Association {

    @Column(updatable=false)
    private Date affectation;

    @Column(updatable=false)
    private Date expiration;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ENTITY_1_ID")
    private Entity1 entity1;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ENTITY_2_ID")
    private Entity2 entity2;

}

public class Entity1 {

    @CollectionOfElements
    @JoinTable(
        table=@Table(name="ASSOCIATION"),
        joinColumns=@JoinColumn(name="ENTITY_1_ID")
    )
    private Set<Association> associations = new HashSet<Association>();
}

public class Entity2 {

    @CollectionOfElements
    @JoinTable(
        table=@Table(name="ASSOCIATION"),
        joinColumns=@JoinColumn(name="ENTITY_2_ID")
    )
    private Set<Association> associations = new HashSet<Association>();
}

之前曾解释过here