我在保存具有子对象的父对象时遇到问题。两个对象都使用@IdClass并引用同一个类(CompositeKey)。我收到以下异常。
grep
调试后,我可以看到与ClassA关联的CompositeKey以某种方式更改为与ClassB关联的那个。
我相信我正在正确保存对象,并且问题可能是hibernate中的某个错误。
如果我创建两个类(CompsiteKeyA和CompositeKeyB)并且让ClassA和ClassB分别使用一个,那么错误就会消失。
触发错误的代码:
org.hibernate.HibernateException: identifier of an instance of com.test.ClassA was altered from com.test.CompositeKey@1ce60be2 to com.test.CompositeKey@18f9997e
classB实例预先存在于数据库中,我希望预先存在的实例与新保存的ClassA实例相关联(通过连接表)。
调试错误后,可以看到与ClassA关联的CompositeKey实例已从(“ClassA Name”,0)更改为(“ClassB Name”,1)。
DAO(我使用spring数据jpa进行持久化):
ClassA classA = new ClassA();
classA.setName("ClassA name");
classA.setVersion(0);
ClassB classB = new ClassB();
classB.setName("ClassB name");
classB.setVersion(1);
Set<ClassB> classBs = new HashSet<>();
classBs.add(classB);
classA.setClassBs(classBs);
classADao.save(classA);
ClassA的:
public interface ClassADao extends JpaRepository<ClassA, CompositeKey>{}
ClassB的:
@Entity
@IdClass(CompositeKey.class)
public class ClassA extends CompositeKey{
@ManyToMany
private Set<ClassB> classBs = new HashSet<>();
}
CompositeKey:
@Entity
@IdClass(CompositeKey.class)
public class ClassB extends CompositeKey{
private String otherField;
}