休眠,扩展实体 - "java.lang.IllegalArgumentException: Unknown entity"



我有一个休眠实体,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并覆盖二传手:

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(因为它是)。有没有一个简单的解决方案?

将基本事件设为@MappedSuperclass和扩展类@Entity

所以

@MappedSuperclass
public class BaseEvent

@Entity
@Table(whatever)
public class ExtendedEvent extends BaseEvent

如果您只想在数据存储中更新更改时才更新地图,我建议您在休眠拦截器中实现 onFlushDirty 。每当每次实体更改将会话刷新到数据库时,都会调用此方法。您可以在 onFlushDirty 方法中检查感兴趣的实体和感兴趣的属性的对象类型。

最新更新