Java 当实体实现接口时,ID getter在Hibernate代理中返回null
我正在使用Hibernate,我有一个问题,当我使用Java 当实体实现接口时,ID getter在Hibernate代理中返回null,java,hibernate,Java,Hibernate,我正在使用Hibernate,我有一个问题,当我使用Session.load加载实体时,ID getter返回null 我的实体都从以下接口继承: public interface Entity { Object getId(); } @javax.persistence.Entity @javax.persistence.Table(name = "`Dog`") public class Dog implements Entity { private java.util.U
Session.load
加载实体时,ID getter返回null
我的实体都从以下接口继承:
public interface Entity {
Object getId();
}
@javax.persistence.Entity
@javax.persistence.Table(name = "`Dog`")
public class Dog implements Entity {
private java.util.UUID id;
@javax.persistence.Id
@javax.persistence.GeneratedValue(generator = "uuid")
@org.hibernate.annotations.GenericGenerator(name = "uuid", strategy = "uuid2")
@javax.persistence.Column(name = "`Id`", nullable = false)
@Override
public java.util.UUID getId() {
return this.id;
}
//...
实现此接口的实体示例:
public interface Entity {
Object getId();
}
@javax.persistence.Entity
@javax.persistence.Table(name = "`Dog`")
public class Dog implements Entity {
private java.util.UUID id;
@javax.persistence.Id
@javax.persistence.GeneratedValue(generator = "uuid")
@org.hibernate.annotations.GenericGenerator(name = "uuid", strategy = "uuid2")
@javax.persistence.Column(name = "`Id`", nullable = false)
@Override
public java.util.UUID getId() {
return this.id;
}
//...
实体中的getId
getter实现接口的getId
,但更改返回类型
当我使用Session.load
加载此实体时,getId
在调用Dog.getId
时返回null
,但在调用entity.getId
时不返回
Dog dog = (Dog)session.load(Dog.class, id);
assert dog.getId() != null; // This fails
assert ((Entity)dog).getId() != null; // This succeeds
当我跟踪dog.getId()
的执行时,它不是由代理处理的,而是进入实际的实现中。因此,它获取Dog
上id
字段的值,该字段为null
,因为它是一个代理
为什么会这样?问题已经消失,我无法找出真正的问题是什么。我尝试将
Entity.getId
的返回类型更改为UUID
,这会引发AbstractMethodError
。最后,升级到最新的Hibernate版本,多次重新编译并清除.m2
Maven缓存,使问题得以解决。