当前位置: 首页 > 面试题库 >

将枚举映射到带有休眠注释的表

亢建木
2023-03-14
问题内容

我有一张桌子DEAL和一张桌子DEAL_TYPE。我想映射以下代码:

public class Deal {
   DealType type;
}

public enum DealType {
   BASE("Base"), EXTRA("Extra");
}

问题在于数据已经存在于数据库中。而且我很难将类映射到数据库。

数据库看起来像这样:

   TABLE DEAL {
      Long id;
      Long typeId;
   }

   TABLE DEAL_TYPE {
       Long id;
       String text;
   }

我知道我可以在交易类型之间使用简单的@OneToMany关系,但是我更喜欢使用枚举。这可能吗?

我几乎可以通过使用EnumType.ORDINAL类型来使其工作。但不幸的是,我的交易类型表中的ID不是连续的,并且不是从1开始。

有什么建议么?


问题答案:

hibernate对Enums来说很可怕。如果不是一个很好的ORM,这是一个奇怪的失败。解决它的“最简单”方法是将枚举声明为自定义hibernate类型。幸运的是,Hibernate编写了一个示例实现,您可以逐字逐字地将其放入应用程序中:

http://www.hibernate.org/265.html

他们甚至包括有关如何使用它的说明。每当我遇到需要持久枚举的情况时,我都会使用这种模式。



 类似资料:
  • 问题内容: 我需要预先将没有实现接口的枚举映射到现有数据库,该数据库使用将该枚举存储在与所有者类相同的表中。 在这种情况下应如何处理映射?持久化到数据库不会改变,因为实现该接口的所有枚举都将具有不同的值,但是我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试实例化一个使用指定的enum类进行枚举吗?Hibernate是否本身支持此功能?)。 问题答案: 可以创建一个自定义(例如th

  • 问题内容: Hibernate提供的注释支持使用或两种类型的映射。当我们使用映射时,它使用的“名称” 而不是Enum 的表示形式。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举: 当我坚持枚举使用,即休眠尝试在数据库中存储的值是开放的。但是,我的数据库列仅包含一个字符,因此会引发异常。 克服这个问题的一个办法是改变枚举类型持有单个字符(如,代替,)。但是,这降低了可读性。有什么

  • 问题内容: 我的Java模型上有一个枚举类型,我想映射到数据库中的表。我正在使用休眠注释,但我不知道该怎么做。由于我搜索的答案比较旧,我想知道哪种方法最好? 提前致谢 问题答案: 除了注释,您还需要其他东西吗?例如,以下枚举: 可以这样使用和注释: 您可以使用批注的enum属性指定枚举应如何在数据库中持久化。指定该枚举将作为整数值保留。在这里,设置为将永久保存为0,保留为1,依此类推。 替代方法是

  • 问题内容: 我有一个使用枚举的数据库表。这已经可以与hibernate(使用XML)一起使用了,我正尝试将其转换为注释,因为这是仍在使用xml表示法的最后一部分。 列定义: 以下作品: 这不起作用: 注释样式在启动时导致以下异常:org.hibernate.HibernateException:UserDTO中列状态的列类型错误。找到:枚举,预期:varchar(255) 我有什么办法强迫它像使用

  • 问题内容: 背景 Spring 3.x,JPA 2.0,Hibernate 4.x,Postgresql 9.x. 使用我想映射到Postgresql枚举的enum属性在Hibernate映射的类上工作。 问题 用enum列上的where子句查询会引发异常。 代码(大大简化) SQL: Hibernate映射类: 调用查询的Java: Hibernate xml查询: 故障排除 按查询而不是枚举按

  • 问题内容: 我有一个带有一个字段的表,该字段可以根据说明符的值(Project,TimeKeep或CostCenter)指向其他3个表之一中的外键。通常这是通过子类实现的,我想知道是否有下面将工作。 请注意,子类名是相同的父类和noteObject属性映射到java.lang.Object类型的实例变量 ,所以应该接受一个项目,TimeKeep或CostCenter对象,只要我们投来正确的类型,h