我有带有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
在没有新列的情况下工作。