假设一个实体带有
Map<String, Object>
。这样的 Map 被序列化为 JSON(根据自定义 AttributeConverter
[此处未列出代码])。像这样:
@Entity
@Table(...)
public class MyEntity {
@Column(...)
private Map<String, Object> aMap;
/* ... */
整个事情进展顺利。 Converter 被调用来插入一个新实体;并加载以前的实体。
现在插入过程变得更加复杂。由于超出我意愿的原因(又名框架),实体被迫(又名
flush()
)插入初始[几乎正确]Map
。
在交易结束之前,这个 Map 会发生一些变化(仅在值中,不在键中,这并不重要)。
我希望 JPA 提供者能够以某种方式看到这些更改(也许通过 Map 的哈希码/等于)并更新数据库。但事实上它错过了的变化。
是否可以告诉JPA:嘿,这个实体很脏[我知道它是,别介意你对此的看法],请再次将其持久化到数据库中吗?
注意:
Map
中的某些值是其他实体(这对 JSON 转换器来说没有问题),并且 Map 所经历的更改正是在这些实体中,在它们的 PK 中,但也许 maybe hashcode/equals 不是对这些变化敏感。
尝试分离和合并:
EntityManager em;
MyEntity myEntity;
//myEntity becomes dirty
em.detach(myEntity);
myEntity = em.merge(myEntity);