是否有可能让Hibernate(3.6)使用给定枚举的值填充数据库表? 我有以下课程:
@Entity
public enum Role
{
ROLE_USER_FREE("ROLE_USER_FREE"),
ROLE_USER_STANDARD("ROLE_USER_STANDARD"),
ROLE_USER_PREMIUM("ROLE_USER_PREMIUM"),
ROLE_ADMIN("ROLE_ADMIN");
... constructor / setter / getter etc.
}
我可以使用此枚举,而不会出现使用
的其他实体类的任何问题@Enumerated(EnumType.STRING)
public Role getRole()
我的问题是,如何自动填充相应的表ROLE? 所有底层逻辑和定义都存在于XML规范中。当然,我可以通过XSL从这个规范生成一个sql文件,并让Hibernate在启动时通过import.sql sematic导入它...但是还有更强的优雅方式吗?
表格应如下所示:
|RoleID|RoleName |
| 0 |ROLE_USER_FREE|
....
答案 0 :(得分:7)
您必须选择一方 - 要么将Role
用作枚举,要么使用实体。你试图做到这两点,这只会导致路上的麻烦。
如果您想使用枚举
@Entity
删除Role
注释。它不是一个实体,它没有主键。它也不应该是可变的,因此坚持它没什么意义。Roles
(或其所谓的)表。 Hibernate按名称(如果您使用@Enumerated(EnumType.STRING)
映射)或values()
数组中的索引(如果您使用@Enumerated(EnumType.ORDINAL)
注释)持久存储枚举。无论哪种方式,它都不会引用您的附加表。随着您的映射(@Enumerated(EnumType.STRING)
),开始使用RoleID
毫无意义。如果您想使用实体
Role
成为真实实体 - 带有getter / setter和标识符的POJO。根据你的需要,它可能是也可能不是可变的。@ManyToOne
。答案 1 :(得分:4)
这会很好地填充我的数据库
public class Person implements UserAccount
{
public static enum Role
{
anon(6), admin(1), standard(4), manager(3), user(5), director(2);
private int weight;
Role(int weight)
{
this.weight = weight;
}
public int weight()
{
return weight;
}
}
@ElementCollection(targetClass = Role.class, fetch=FetchType.EAGER)
@Enumerated(EnumType.STRING) // Possibly optional (I'm not sure) but defaults to ORDINAL.
@CollectionTable(name="person_roles")
@Column(name="role")
public Set<Role> getRoles()
{
return roles;
}
...