【问题标题】:Association class Mapping in HibernateHibernate 中的关联类映射
【发布时间】:2014-05-21 10:10:33
【问题描述】:

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

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

                                 |
                                 |
                                 |
                                 |
                                 |
                          Association class
                           Date_affectation
                           Date_expiration

我应该使用什么关联规则?

【问题讨论】:

    标签: java hibernate mapping


    【解决方案1】:

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

    您可以将关联的 PK 建模为 Entity_1Entity_2 的外键的组合 - 这将使关联成为依赖实体。或者您可以为其分配一个自己的 id 并通过多对一关系连接到 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>();
      ...
    }
    

    【讨论】:

    • 我知道我将有一个包含两个键和日期(过期和影响)的表用于关联,并为每个实体提供一个表,你能澄清一下你回答的人吗
    • 我的理解是您已经将类关联转换为两个关联,每个关联与 Entity[1]-----[*]Association_class 不是吗?
    • 没错。您还可以将关系表映射为两个实体中的映射,但我发现实体/可嵌入方法更简洁。
    【解决方案2】:

    除非您想通过它的 id 获取关联,否则您应该选择一个可嵌入的关联来定义这两个日期字段。

    @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之前已经解释过了。

    【讨论】:

    • 是否需要在Entity1和Entity2中添加导航功能?
    • 因为关联是可嵌入的,所以它的生命周期绑定到一个实体。您不能查询可嵌入对象,只能查询实体,这就是为什么您需要 Entity1 和 Entity2 中的“关联”关系。如果您需要查询关联,或者您希望它独立于 Entity1 或 Entity2,那么您应该考虑 @kostja 的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2020-04-14
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多