Postgresql 使用fetchtype LAZY和@ManyToOne从Spring存储库传输了错误的UUID(主键)

Postgresql 使用fetchtype LAZY和@ManyToOne从Spring存储库传输了错误的UUID(主键),postgresql,hibernate,spring-data-jpa,Postgresql,Hibernate,Spring Data Jpa,当我获取一个实体时,我有一种奇怪的行为,它类似于另一个实体的“父级”。以下是我的实体类: 母公司实体(“一方”) package so.lazy; 导入java.util.LinkedHashSet; 导入java.util.Set; 导入javax.persistence.Entity; 导入javax.persistence.OneToMany; @实体 公共类父扩展基{ 私有静态最终长serialVersionUID=-1111542804002616234L; @一家公司(mappedB

当我获取一个实体时,我有一种奇怪的行为,它类似于另一个实体的“父级”。以下是我的实体类:

母公司实体(“一方”)

package so.lazy;
导入java.util.LinkedHashSet;
导入java.util.Set;
导入javax.persistence.Entity;
导入javax.persistence.OneToMany;
@实体
公共类父扩展基{
私有静态最终长serialVersionUID=-1111542804002616234L;
@一家公司(mappedBy=“一家”)
private Set children=new LinkedHashSet();
//更多领域
公共集getChildren(){
返回儿童;
}
公共无效集合子对象(集合子对象){
这个。孩子=孩子;
}
@凌驾
公共字符串toString(){
返回“父{”+
“dataId=“+getDataId()+
'}';
}
//更多的能手和二传手
}
子实体(“多方”)

package so.lazy;
导入javax.persistence.*;
@实体
公共类子扩展基{
私有静态最终长serialVersionUID=-8798542804002616234L;
@manytone(fetch=FetchType.LAZY)
私人家长;
//更多领域
公共父getParent(){
返回父母;
}
公共void setParent(父级){
this.parent=parent;
}
//更多的能手和二传手
}
抽象基类

package so.lazy;
导入java.io.Serializable;
导入java.util.UUID;
导入javax.persistence.*;
导入org.hibernate.annotations.Type;
@映射超类
公共抽象类基类实现了可序列化{
@身份证
@列(name=“data\u id”)
@类型(Type=“pg uuid”)
私有java.util.UUID数据ID;
公共基地(){
dataId=UUID.randomUUID();//生产:com.fasterxml.UUID.UUID类型1
}
公共UUID getDataId(){
返回数据标识;
}
公共void setDataId(UUID dataId){
this.dataId=dataId;
}
}
当我使用此代码时:

对于输出A和B中的父级,输出包含两个完全不同的UUID。
方法
Parent#toString()
给出了正确的UUID,getter给出了错误的UUID

为什么?

如果我在
Child
中切换到
@manytone(fetch=FetchType.EAGER)
作为
父项
,它可以正常工作

我的依赖项:
弹簧4.3.8
Spring数据JPA 1.11.0

PostgreSQL 9.4-1202-jdbc42

当您执行child.getParent()时,您应该从db获取数据,老实说,没有什么不同,我也很困惑这怎么可能。我认为构造函数逻辑与延迟加载顺序相冲突,您是否可以尝试将随机UUID的创建放在一个带有空检查的块中,作为我之前的注释?它更容易控制,我认为这是一个解决方案…@buræquete-对不起,不,我没有尝试。我问题中的代码不属于MCVE。此外,在实体的创建(使用构造函数的地方)和查询之间有很多会话。是的,我知道,但是唯一可以生成无效UUID的代码也在该构造函数块中,难道你不能至少尝试一下吗?调用
parent.toString()时会发生什么情况
再次从父级.getDataId()获取正确的UUID后,它是否仍然返回错误的UUID?也许
toString()
的定义方式会以某种方式触发构造函数?你能检查一下它的执行情况吗?
Child child=childrepository.findOne(uuid);
Parent parent=child.getParent();

System.out.println("Parent: " + parent.toString());        // Output A
System.out.println("ID in parent: " + parent.getDataId);   // Output B