繁体   English   中英

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

[英]JPA single table inheritance with abstract generics and collection

我有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表中添加新列,因此无法正常工作。

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

我认为它应该工作。

未添加列,因为不需要新列。 联接表可以执行此操作。 我有一些不同的实体名称,但看看这些数据

  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

比较ID,您可以看到Value通过映射表引用了自身。 因此,两个MultiStringValue都与两个相同的StringValue有关系,因此ManyToMany在没有新列的情况下工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM