Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA枚举继承_Java_Spring_Jpa - Fatal编程技术网

Java JPA枚举继承

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

我有一个名为“Category”的接口和4个enum来实现这个接口。 这些枚举是按类别确定的,并且有不同的类型。 例如:

#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
实际上应该是枚举。。。您甚至在enum
GroceryPurchase
ElectronicPurchase
中存储了哪些enum值?是的,您肯定应该过度考虑这一点。你能给出一个你在那里实际实现的值吗?我想不出你会说什么智能手机是硬件,但有趣的是,如果随机消费者的购买行为更多地发生在智能手机上,而不是普通硬件上。但是谢谢你,它帮助了我!