今天遇到了一个 JPA cascadeType 不管用的问题,折腾了半天。
现象:
一个 Server 对象, ManyToOne Unidirectional 包含了 OS 对象。
但是保存 Server 对象时, CascadeType.PERSIST 不管用。非得用 CascadeType.ALL 才行。
可是我又不想用 CascadeType.ALL, 因为里面也含有 CascadeType.REMOVE,我不想一个 Server Instance 被删了,强迫把所有的 OS 也删了。
我甚至把 CascadeType.ALL 展开写,把五种情况都写全了,就是不管用。只有直接用 CascadeType.ALL 才管用。
为什么?
原因是我的 DAO 底层没有使用 标准 JPA 实现,而是使用 Hibernate 的 SaveOrUpdate 实现。因此,相应的保存事件不是通过 PERSIST。后来,我把 DAO 的实现重写了。用标准的persist() 和 merge() 函数来实现。这样 Listener 就能监听到相应的操作,就会主动替我去 persist() 包含的类了。整个世界都清净了。
看来起要好好学习 JPA。