【问题标题】:Mapping a list of Java 8 month enum in Hibernate在 Hibernate 中映射 Java 8 月枚举列表
【发布时间】:2014-03-26 12:33:21
【问题描述】:

是否可以像这样将 java.time.Month 列表映射到单独的表:

|MyEntity             |    |MyEntity_Month    |    |Month          |
|---------------------|    |------------------|    |---------------|
|id : long            |    |myEntity_Id : long|    |id : long      |
|                     |----|month_Id : long   |----|               |
|---------------------|    |------------------|    |---------------|

我已经这样尝试过了,但它只创建了一个带有 myEntity_Id 和值的表 MyEntity_Month:

@ElementCollection(targetClass = Month.class, fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "MyEntity_Months"
        , joinColumns = @JoinColumn(name = "myEntity_id"))
private List<Month> months;

该解决方案的问题是每个 MyEntity 的值都是重复的,而不是关联的。上述注解配置的数据库视图:

|MyEntity             |    |MyEntity_Month         | 
|---------------------|    |-----------------------|
|id : long            |    |myEntity_id | MONTH    |
|...                  |----|-----------------------|
|---------------------|    |1           | NOVEMBER |
                           |1           | DECEMBER |
                           |2           | JANUARY  |
                           |2           | DECEMBER |
                           |-----------------------|

是否可以通过关联表进行映射,以便我只需要数据库中的 12 个月字符串?我正在使用 Hibernate 4.3 / JPA 2.1 顺便说一句

【问题讨论】:

  • 你能解释一下这与 Java 8 有什么关系吗?
  • java.time.Month 是 Java 8 类型。也许对于这个特定的例子有一个解决方法,比如 Jadira Usertype 之类的 Java 8 时间映射器。

标签: java hibernate enums java-8


【解决方案1】:

java.time.Month 类型没有@Entity 注解,所以它不会被hibernate 识别为实体。如果引入 MonthWrapper 之类的东西,您可以实现所需的表映射:

@Entity
public class MyEntity {

    @Id
    private Long id;

    @OneToMany(fetch = FetchType.EAGER)
    private List<MonthWrapper> months;
}


@Entity
public class MonthWrapper {

    @Id
    private Long id;

    @Enumerated(EnumType.STRING)
    private Month month;
}

然后,如果您使用 create-drop hbm2ddl.auto 属性通过 hibernate 运行它,那么您会得到以下表格:

Hibernate:创建表MonthWrapper(id bigint not null,month varchar(255),主键(id))

Hibernate:创建表 MyEntity(id bigint not null,主键(id))

Hibernate:创建表 MyEntity_MonthWrapper(MyEntity_id bigint not null,months_id bigint not null)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2018-06-13
    相关资源
    最近更新 更多