gpt4 book ai didi

java - JPA 枚举继承

转载 作者:行者123 更新时间:2023-12-05 04:02:53 25 4
gpt4 key购买 nike

我有一个名为“类别”的接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com