hibernate - 列值的自动转换(字符串到枚举)

时间:2012-07-23 09:22:44

标签: hibernate hibernate-mapping

有没有办法做这样的事情。我有一个叫做人的实体。

@Entity
@Table(name = "PERSON")
public class Person {
   @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
   String name;
   @Column(name = "NATIONALITY", length = 128, columnDefinition = "VARCHAR2(128)")
   String nationality;
}

民族'列具有数值 - 每个数字都是一个国家/地区的代码。我想绘制一个国籍'字段到我的自定义枚举并创建一些方法转换代码< - > country。

@Entity
@Table(name = "PERSON")
public class Person {
   @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
   String name;
   @Column(name = "NATIONALITY", length = 128, columnDefinition = "VARCHAR2(128)")
   Nationality nationality;
}

enum Nationality {
   USA, Brazil, Germany; // etc.
}

public static Nationality codeToNationality(String code);

这样的东西有没有hibernate方法?我无法修改列定义 - 数据库是只读的。

我想要实现的第二件事是排除任何未解决的国籍代码实体。 codeToNationality(...)== null的实体对于休眠是不可见的。

我的模特(人,国籍)只是一个例子。

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

两个问题:

  1. 将enum映射到一般字符串和
  2. 将unknown映射为null
  3. 可以通过创建适当的UserType来解决。

    可以在here找到有关枚举和自定义用户类型的示例。自定义类型的一般说明是Hibernate documentation的一部分。

    其他选项是为枚举提供特定的setter,它们将转换为和映射到数据库列的字符串值。如果仅在此实体中需要此自定义类型,则这是可行的。

答案 1 :(得分:0)

对于您的第一个问题,请查看@Enumerated JPA Annotation,这会将您的字符串映射到枚举。使用(EnumType.STRING)属性,您应该能够覆盖枚举值的name()并返回与数据库中的字符串完全相同的字符串。

答案 2 :(得分:0)

好的,我已经使用UserType将String转换为国籍。

public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
   String value = rs.getString(names[0]);
   // resolve nationality
   return /nationality found/ ? /Nationality object/ : null;
}

现在我还有其他问题。如何创建仅寻找已解决国籍的标准?

当我这样做时

criteria.add(Restrictions.isNotNull("nationality"));

条件查询字符串字段,而不是国籍字段,它始终不为空。

我理解Criteria适用于原始数据库(在转换为java实体之前),所以我怎样才能得到我想要的东西 - 过滤未解决的国籍行?