作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为“类别”的接口(interface)和实现此接口(interface)的 4 个枚举。这些枚举是按类别确定的,并且具有不同的类型。示例:
#Interface
interface BillCategory
#Enum 1
public enum GroceryPurchase implements BillCategory {
VEGAN,
VEGETARIAN,
PESCITARIAN,
FLEXITARIAN,
OMNIVORE
#Enum 2
enum ElectronicPurchase implements BillCategory{
SMARTPHONE, HARDWARE, SOFTWARE }
我将该字段添加到实体类。
private BillCategory billCategory;
当我启动 Spring Environemnt 时,出现以下 Hibernate/JPA 错误:
Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: net.wizypay.wizypay.bill.model.BillCategory, at table: bill_entity, for columns: [org.hibernate.mapping.Column(bill_category)]
我该如何解决这个问题?我不想将枚举总结为一个。有更好的方法吗?或者根本不可能保存这些数据。
最佳答案
您心中有两个相互冲突的目标,并在没有意识到的情况下试图同时满足这两个目标。
当您将常量拆分为多个实现相同接口(interface)的枚举时,您的目标是实现可扩展性:您从使用枚举的代码中移除了对枚举本身的依赖。您可以在不破坏任何现有代码的情况下自由创建新枚举。
当您使用 JPA 将关系映射到 Java 对象时,您的目标是集中构建和序列化对象的代码。请注意 - 除非您正在使用反射 - 此代码必须依赖于您正在使用的所有类型,因为它需要能够构建所有值。具体来说,如果数据库存储一个字符串“APPLE”,它需要知道它是 Computer.APPLE 还是 Fruit.APPLE。
除非您使用反射 - 存储相关类的名称 - 否则不可能以一般方式进行。如果你使用反射,你就会失去另一件事:抽象。突然之间,您的数据库数据依赖于您的 Java 实现。
你必须:
根据您的要求,一个干净的解决方案是使用以下方法构建转换器:
BillCategory fromString(String category);
String fromCategory(BillCategory category);
这将保持数据库清洁和 Java 代码独立于枚举。以在一个地方进行两次总开关为代价。
关于java - JPA 枚举继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54093620/
我是一名优秀的程序员,十分优秀!