我有2个数据库表:
如何使用Hibernate Mapping将表1中的枚举序号映射到表2中存储的名称?
编辑: 基本上,使用SQL SELECT,我会使用序数加入2个表来获取名称。我不知道如何在hibernate中做到这一点。
这不重复;我没有使用Hibernate逆向工程。
答案 0 :(得分:1)
您可以将Java端作为:
@Enumerated(EnumType.ORDINAL)
@Column(name = "user_type")
private UserType userType;
public enum UserType {
CLIENT,
ADMIN;
}
和SQL方面: CREATE TABLE用户( id bigint PRIMARY KEY, user_type bigint NOT NULL );
CREATE TABLE enum_user_type (
id bigint PRIMARY KEY,
name varchar(255),
desc text
);
ALTER TABLE user ADD CONSTRAINT user_type_fk FOREIGN KEY (user_type) REFERENCES enum_user_type(id);
INSERT INTO enum_user_type (id, name, desc) VALUES ( 0, 'CLIENT', 'This is a client');
INSERT INTO enum_user_type (id, name, desc) VALUES ( 1, 'ADMIN', 'This is an admin');
所以在java中你总是设置:
user.setUserType(UserType.ADMIN);
在用户表中,使用序数存储枚举。
由于您已经拥有枚举关联表,因此可以在SQL JOIN中使用本地查询。
如果您发现需要使用HQL来获取枚举名称或描述,那么枚举应该被提升为实体。
答案 1 :(得分:0)
我通过创建org.hibernate.usertype.EnhancedUserType
的自定义实现解决了这个问题,将nullSafeGet
,nullSafeSet
,fromXMLString
,objectToSQLString
和toXMLString
覆盖到所有人使用ordinal
代替name
。
它有效,但我不喜欢它,因为它违背了枚举的目的,不必处理乱序的价值。就目前而言,重新排序枚举值将使数据库中的所有数据无效。
此解决方案完全忽略第二个表,即存储枚举序号和名称的表。