Hibernate,扩展实体“java.lang.IllegalArgumentException:未知实体”
我有一个Hibernate实体BaseEvent
,它可以正常工作:
import javax.persistence.*;
@Entity
@Table(name = "base_event")
@SequenceGenerator(name = "seq", allocationSize = 1, sequenceName = "seq")
public class BaseEvent
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@Column(name = "id")
protected Long id = null;
@Column(name = "my_field", nullable = false)
protected String myField;
public Long getId()
{
return id;
}
public void setId(final Long id)
{
this.id = id;
}
public String getMyField()
{
return myField;
}
public void setMyField(final String myField)
{
this.myField = myField;
}
}
我想确定这个对象何时被更改,并在我的应用程序中更新一些Map
。我能想到的最简单的方法是扩展BaseEvent
并重写setter:
import java.text.MessageFormat;
public class ExtendedEvent extends BaseEvent
{
@Override
public void setMyField(final String myField)
{
System.out.println(MessageFormat.format("Setting myField to {0}", myField));
super.setMyField(myField);
}
}
这在我的应用程序中运行良好,但是当我要持久化实体时,Hibernate抱怨它不知道ExtendedEvent
是什么
java.lang.IllegalArgumentException: Unknown entity: my.package.ExtendedEvent
我可以看出,扩展Hibernate实体是一个非常重要的问题,特别是当您开始添加字段时——但我只希望Hibernate将ExtendedEvent
视为BaseEvent
(因为它是)。有没有简单的解决办法
# 1 楼答案
如果只想在数据存储中更新更改时更新地图,我建议实现onFlushDirty in a Hibernate Interceptor。每当针对每个实体更改将会话刷新到数据库时,就会调用此方法。可以在onFlushDirty方法中检查感兴趣实体和感兴趣属性的对象类型
# 2 楼答案
使基事件
@MappedSuperclass
和扩展类@Entity
所以
及