gpt4 book ai didi

java - JPA:确保子对象在更新时被替换

转载 作者:行者123 更新时间:2023-12-02 01:15:49 26 4
gpt4 key购买 nike

有一个持久类,它具有子元素的集合(setter、getter 等,从列表中删除):

@Entity
@Table(tableName = "...")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "myEntity")
private List<DateValue> values;
}

子类实际上只是 LocalDate 和 BigDecimal 的元组:

@Entity
@Table(name = "my_entity_date_values")
public class DateValue implements Serializable {

LocalDate date;

BigDecimal value;

@ManyToOne
@JoinColumn(name = "my_entity_id")
MyEntity myEntity;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
}

问题是,当创建新的(临时)值列表并使用 setter 设置时,会创建新实体而不是替换现有实体:

List<DateValue> values = someDto.getSomeValues().entrySet().stream()
.map(entry -> new DateValue(entry.getKey(), entry.getValue(), myEntity))
.collect(Collectors.toList());
MyEntity.setValues(values);

可以采取什么措施来避免这种情况并确保旧值被更新或被新值替换?

最佳答案

解决方案是在 DataValue 的情况下将 @Entity 替换为 @Embeddable,并将所属类 (MyEntity) 中的列表标记为 @ElementCollection。

@Entity
@Table(tableName = "...")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@ElementCollection
@CollectionTable(name = "my_entity_date_values")
private List<DateValue> values;
}

@Embeddable
public class DateValue implements Serializable {
LocalDate date;

BigDecimal value;
}

关于java - JPA:确保子对象在更新时被替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57660679/

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