Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何持久化枚举集(使用两个数据库表)?_Java_Hibernate_Jpa_Enums_Persistence - Fatal编程技术网

Java 如何持久化枚举集(使用两个数据库表)?

Java 如何持久化枚举集(使用两个数据库表)?,java,hibernate,jpa,enums,persistence,Java,Hibernate,Jpa,Enums,Persistence,我想将一组选项表示为实体中的枚举集和数据库中的一对多关系。如何正确地做到这一点?我只能找到旧的(注释前)答案或不使用两个表的答案 我定义了以下表格: 创建表用户( id串行主键, 名称VARCHAR(255)非空唯一 ); 创建表用户选项( 用户id INT, 用户选项VARCHAR(255), 主键(用户id、用户选项), 外键(用户id)引用用户(id) 关于删除级联 关于更新级联 ); 此实体类: @实体(name=“Users”) 公共最终类用户{ @身份证 @生成值 私有int-id

我想将一组选项表示为实体中的枚举集和数据库中的一对多关系。如何正确地做到这一点?我只能找到旧的(注释前)答案或不使用两个表的答案

我定义了以下表格:

创建表用户(
id串行主键,
名称VARCHAR(255)非空唯一
);
创建表用户选项(
用户id INT,
用户选项VARCHAR(255),
主键(用户id、用户选项),
外键(用户id)引用用户(id)
关于删除级联
关于更新级联
);
此实体类:

@实体(name=“Users”)
公共最终类用户{
@身份证
@生成值
私有int-id;
@列(nullable=false,unique=true)
私有字符串名称;
私人最终设置选项;
{
this.options=EnumSet.noneOf(UserOption.class);
}
/*包含id的普通getter*/
/*包含名称的普通getter和setter*/
@ElementCollection(fetch=FetchType.EAGER)
@枚举(EnumType.STRING)
@CollectionTable(name=“用户选项”
,joinColumns=@JoinColumn(name=“user\u id”))
@列(name=“user\u option”,null=false)
公共集getOptions(){
返回此选项;
}
}
当然还有一个枚举:

公共枚举用户选项{
方案A,
方案B,
方案C;
}
当我启动Tomcat时,会出现以下异常:

org.hibernate.MappingException:无法确定列:[org.hibernate.mapping.Column(选项)]
此异常是一组相互导致的异常的根。它会导致一个
javax.persistence.PersistenceException
(无法构建EntityManagerFactory),这反过来会导致一些依赖注入异常


我承认我对JPA/Hibernate不够精通,无法理解我做错了什么。有人能帮我吗?

事实证明答案比我想象的要简单。不能在实例变量和getter上混合使用JPA注释。注释本身很好。我改变了我的实体类如下,现在一切正常

@实体(name=“Users”)
公共最终类用户{
@身份证
@生成值
私有int-id;
@列(nullable=false,unique=true)
私有字符串名称;
@ElementCollection(fetch=FetchType.EAGER)
@枚举(EnumType.STRING)
@CollectionTable(name=“用户选项”
,joinColumns=@JoinColumn(name=“user\u id”))
@列(name=“user\u option”,null=false)
私人最终设置选项;
{
this.options=EnumSet.noneOf(UserOption.class);
}
/*包含id的普通getter*/
/*包含名称的普通getter和setter*/
公共集getOptions(){
返回此选项;
}
}