无法在父级和子级上使用相同的@IdClass

时间:2015-09-08 03:07:35

标签: java hibernate spring-data spring-data-jpa

我在保存具有子对象的父对象时遇到问题。两个对象都使用@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;
}

0 个答案:

没有答案