如何将enum序数映射到hibernate中的值?

时间:2014-05-22 19:50:09

标签: java hibernate jpa enums hibernate-mapping

我有2个数据库表:

  1. 坚持一个类,其字段类型为枚举。在相应的列中,存储枚举值的序数。
  2. 保留枚举值'序数和名称。
  3. 如何使用Hibernate Mapping将表1中的枚举序号映射到表2中存储的名称?

    编辑: 基本上,使用SQL SELECT,我会使用序数加入2个表来获取名称。我不知道如何在hibernate中做到这一点。

    这不重复;我没有使用Hibernate逆向工程。

2 个答案:

答案 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的自定义实现解决了这个问题,将nullSafeGetnullSafeSetfromXMLStringobjectToSQLStringtoXMLString覆盖到所有人使用ordinal代替name

它有效,但我不喜欢它,因为它违背了枚举的目的,不必处理乱序的价值。就目前而言,重新排序枚举值将使数据库中的所有数据无效。

此解决方案完全忽略第二个表,即存储枚举序号和名称的表。