java - 具有抽象泛型和集合的 JPA 单表继承

标签 java list hibernate jpa inheritance

我的 JPA 映射类如下:

@Entity
@Inheritance
public abstract class FieldValue<T> {
   @Id @GeneratedValue
   private Long id;

   public abstract T getValue();
}

@Entity
public class TextFieldValue extends FieldValue<String> {
   @Column(name = "TEXT_VALUE")
   private String value;

   public String getValue() { return value; }
}

@Entity
public class NumberFieldValue extends FieldValue<Double> {
   @Column(name = "NUMBER_VALUE")
   private Double value;

   public Double getValue() { return value; }
}

@Entity
public class SelectFieldValue extends FieldValue<ValueOption> {
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "SELECT_VALUE")
   private ValueOption value;

   public ValueOption getValue() { return value; }
}

我使用单个表继承类型,这会导致每个值字段映射到不同的列。在 SelectFieldValue 中,该值是对另一个实体的引用,但映射仍然可以正常工作,用 ValueOption 的 id 填充 SELECT_VALUE 列。

但是,我还想添加带有实体列表的类:

@Entity
public class MultipleSelectFieldValue extends FieldValue<List<ValueOption>>{
   @ManyToMany // ??
   private List<ValueOption> value;

   public List<ValueOption> getValue() { return value; }
}

我似乎找不到正确的映射来处理此类实体列表。单表继承策略是否有可能实现这一点?例如,它可以使用连接表中单行的 id 填充 MultipleSelectFieldValue 列,该列将存储从 MultipleSelectFieldValue 到 ValueOption 的多对多映射。

我尝试了以下映射:

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "field_value_value_option",
        joinColumns = @JoinColumn(name = "field_value_id"),
        inverseJoinColumns = @JoinColumn(name = "value_option_id"))
private List<ValueOption> value;

但奇怪的是,它没有向 FieldValue 表添加新列,因此无法正常工作。

最佳答案

But strangely, it does not add a new column to the FieldValue table, hence does not work properly.

我认为它应该发挥作用。

未添加列,因为不需要新列。连接表就可以完成这个任务。我的实体名称略有不同,但请看一下此数据

  id  |      dtype       | number_value | string_value 
------+------------------+--------------+--------------
 1551 | StringValue      |              | hi!
 1552 | NumberValue      |           55 | 
 1553 | MultiStringValue |              |
 1554 | StringValue      |              | s1
 1555 | StringValue      |              | s2
 1556 | MultiStringValue |              | 

然后看一下映射表

 field_value_id | value_option_id 
----------------+-----------------
           1553 |            1554
           1553 |            1555
           1556 |            1554
           1556 |            1555

比较ids可以看到Value通过映射表引用了它自己。因此,两个 MultiStringValue 都与两个相同的 StringValue 存在关系,因此 ManyToMany 无需新列即可工作。

关于java - 具有抽象泛型和集合的 JPA 单表继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47515984/

相关文章:

r - 将列名和行名添加到 R 中的列表元素中

list - 创建二维列表矩阵

java - 使用二维数组超出内存限制

java - gcp 数据流模板,错误 : (gcloud. beta.dataflow.jobs.run)INVALID_ARGUMENT:不支持环境版本的作业类型

java - Mac OSX 10.10.2 上的 JDK 仍指向 1.6

java - 对于 JAMA 或其他库,将 List<List<Double>> 转换为 double[][]

java - 绕过 PUT 请求的唯一性 validator

java - 持久化异常:

java - 如何通过方法调用在 Hibernate 中打开急切初始化

java - 缺少 Maven 依赖项,无法导入类