gpt4 book ai didi

java - 在 Hibernate 中映射 Java 8 月份枚举列表

转载 作者:行者123 更新时间:2023-12-01 13:13:22 25 4
gpt4 key购买 nike

是否可以将 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 的值都是重复的,而不是关联的。上述注解配置的数据库 View :

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

是否可以通过关联表进行映射,以便我只需要数据库中的 12 个月字符串?我正在使用 Hibernate 4.3/JPA 2.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: create table MonthWrapper (id bigint not null, month varchar(255), primary key (id))

Hibernate: create table MyEntity (id bigint not null, primary key (id))

Hibernate: create table MyEntity_MonthWrapper (MyEntity_id bigint not null, months_id bigint not null)

关于java - 在 Hibernate 中映射 Java 8 月份枚举列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22661207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com