Hibernate中的多值属性

时间:2015-04-07 16:11:12

标签: java hibernate

我有以下实体:

____________________             ____________________
|  Activity        |             |  Benefit         |
------------------ |             |------------------|
| activityId:long  |-------------| benefitId: long  |
| activity:varchar |             | activityId: long |
| ....             |             | benefit: varchar |
--------------------             -------------------|

我可以将它映射到Hibernate,所以我最终得到了这个:

@Entity
class Activity {
    @Id
    private Long id;
    private String activity;


    private List<String> benefits;
}

2 个答案:

答案 0 :(得分:2)

是的,您可以使用@ElementCollection标记。

以下是您的代码的样子:

@Entity
@Table(name = "Activity")
class Activity {
    @Id
    @Column(name="activity_id")
    private Long id;

    @Column(name = "name") 
    private String activity;

    @ElementCollection
    @CollectionTable(
        name = "Benefit",
        joinColumns = @JoinColumn(name = "activityId")
    )
    private List<String> benefits;

}

虽然我会调用表ActivitiesBenefits而不是Benefit来表明该表将存储成对的活动和好处。此外,不需要benefitId,因为好处是一个弱实体(没有活动就不能存在),所以你也可以放弃它。

参考:https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

答案 1 :(得分:1)

您好我能找到一种可以做到的方法。下面是相同的代码。

@Entity
@Table(name = "Activity")
class Activity {
    @Id
    @Column(name="activity_id")
    private Long id;
    @Column(name = "name") 
    private String activity;

    @OneToMany
    @Formula("(select CONCAT(benefitId, activityId, benefit) from Benefit b where b.activityId = activity_id)")
    private List<String> benefits;
}

我正在使用sql返回的好处列表,然后连接它并将其存储在我们的好处列表中。 公式中的字符串是SQL(不是HQL),因此它的列名称不是归档成员名称。