Java JPA枚举继承
我有一个名为“Category”的接口和4个enum来实现这个接口。 这些枚举是按类别确定的,并且有不同的类型。 例如:Java JPA枚举继承,java,spring,jpa,Java,Spring,Jpa,我有一个名为“Category”的接口和4个enum来实现这个接口。 这些枚举是按类别确定的,并且有不同的类型。 例如: #Interface interface BillCategory #Enum 1 public enum GroceryPurchase implements BillCategory { VEGAN, VEGETARIAN, PESCITARIAN, FLEXITARIAN, OMNIVORE #Enum 2 enum Electronic
#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环境时,会出现以下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)]
我怎样才能解决这个问题?我不想将枚举总结为一个。有更好的方法吗?或者根本不可能保存这些数据 好的,我不确定智能手机如何不是硬件,但是可以。下面是我将如何做到这一点(不确定我是否丢弃了您现在真正需要的东西)。将
BillCategory
设置为枚举。添加私有字段PurchaseType
(这也可以是另一个枚举,其中包含grocerypourchase
或electronicspurchase
)和Category
(这是字符串,与枚举名称匹配)。这应该可以解决hibernate的问题
说明我的意思的代码:
enum BillCategory {
VEGAN("VEGAN", PurchaseType.GroceryPurchase),
VEGETARIAN("VEGETARIAN",PurchaseType.GroceryPurchase),
SMARTPHONE("SMARTPHONE", PurchaseType.ElectronicPurchase);
private String category;
private PurchaseType type;
BillCategory(String category, PurchaseType type) {
this.category = category;
this.type = type;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public PurchaseType getType() {
return type;
}
public void setType(PurchaseType type) {
this.type = type;
}
}
enum PurchaseType {
ElectronicPurchase, GroceryPurchase;
}
然后还应注释
私人BillCategory
在实体类中使用类似于@Enumerated(EnumType.ORDINAL)
或其他一些EnumType
的内容,这取决于您希望如何将其保存在数据库中您脑海中有两个相互冲突的目标,并试图同时满足这两个目标,但没有意识到这一点
当您将常量拆分为多个实现同一接口的枚举时,您的目标是可扩展性:使用枚举将依赖项从代码中移除到枚举本身。您可以在不破坏任何现有代码的情况下自由创建新枚举
当您使用JPA将关系映射到Java对象时,您的目标是集中构建和序列化对象的代码。请注意,除非您使用反射,否则此代码必须依赖于您使用的所有类型,因为它需要能够构建所有值。具体来说,如果数据库存储了一个写有“APPLE”的字符串,它需要知道是Computer.APPLE还是Fruit.APPLE
除非您使用反射—存储所讨论的类的名称—否则不可能以一般方式进行。如果你使用反射,你就失去了另一个东西:抽象。突然,数据库数据依赖于Java实现
你必须:
- 接受你试图完成的不可能的事情
- 优先考虑你的需求
BillCategory fromString(String category);
String fromCategory(BillCategory category);
这将保持数据库干净,Java代码独立于枚举。在一个地方花费两个总开关。假设enum ElectronicPurchase有一个值“X”,那么进入数据库的很可能是值“X”,除非它是您存储的顺序值。当实体只有一个基类型“BillCategory”和一个值“X”时,加载实体时休眠如何知道它需要使用枚举类ElectronicPurchase?不可能。所以不,你不能这么做。如果我没有完全弄错的话,让
BillCategory
成为enum
并让它拥有名为GroceryPurchase
和ElectronicPurchase
@XtremeBaumer的实例会更有意义,因为你不能从enum atGimby继承好的,谢谢,也许有人现在有了一个解决方案,但我想同时我必须想出另一种方法,这就是为什么billcegory
实际上应该是枚举。。。您甚至在enumGroceryPurchase
和ElectronicPurchase
中存储了哪些enum值?是的,您肯定应该过度考虑这一点。你能给出一个你在那里实际实现的值吗?我想不出你会说什么智能手机是硬件,但有趣的是,如果随机消费者的购买行为更多地发生在智能手机上,而不是普通硬件上。但是谢谢你,它帮助了我!