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

标签 java jpa

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

相关文章:

java - 在 JPA 中获取多对一关联时出现问题

java - 没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

java - Swing:在 JPanel 中绘制图形会改变其尺寸吗?

java - 代码找不到我的文件

java - 在 JPQL 中选择新的

java - 添加到集合时 PreUpdate 不触发

JPA EntityManager createQuery() 与 createNamedQuery() 和 createNativeQuery()

java - 如果 ORA-02049 包含在分布式事务中,对 "just change your program"的良好响应是什么?

java - 如何将 joda 时间的 YearMonth 类型的属性保存到一列中?

java - 为什么 "while(true)"和 "Thread.sleep"导致 100% CPU 使用率?