有一个持久类,它具有子元素的集合(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/