gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:57:10 28 4
gpt4 key购买 nike

我的 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/

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