Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Hibernate_Jpa_Inheritance - Fatal编程技术网

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

Java 带有抽象泛型和集合的JPA单表继承,java,list,hibernate,jpa,inheritance,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 = "

我有如下带有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; }
}
@实体
@继承权
公共抽象类字段值{
@Id@GeneratedValue
私人长id;
公共抽象T getValue();
}
@实体
公共类TextFieldValue扩展了FieldValue{
@列(name=“TEXT\u VALUE”)
私有字符串值;
公共字符串getValue(){return value;}
}
@实体
公共类NumberFieldValue扩展了FieldValue{
@列(name=“NUMBER\u VALUE”)
私人双重价值;
public Double getValue(){return value;}
}
@实体
公共类SelectFieldValue扩展了FieldValue{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“选择值”)
私人价值期权价值;
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; }
}
@实体
公共类MultipleSelectFieldValue扩展了FieldValue{
@许多/??
私有列表值;
公共列表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;
@ManyToMany(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name=“field\u value\u value\u option”,
joinColumns=@JoinColumn(name=“field\u value\u id”),
inverseJoinColumns=@JoinColumn(name=“value\u option\u id”))
私有列表值;
但奇怪的是,它没有向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
s都与两个相同的
StringValue
s有关系,因此
manytomy
在没有新列的情况下工作。

@manytomy relationship需要一个额外的表来存储该关系。因此,您的映射应该有效。为什么你认为这行不通?我也有同感,但这种映射不会为表的MultipleSelectFieldValue生成额外的列。我已经用代码更新了我的问题。为什么
单表
?加入
您可以摆脱所有
@列(name=“XXXX\u VALUE”)
您完全正确。我没有好好想清楚。实际上,我的代码中有一个不同的bug,导致测试失败。JPA映射运行正常。