有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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(因为它是)。有没有简单的解决办法


共 (2) 个答案

  1. # 1 楼答案

    如果只想在数据存储中更新更改时更新地图,我建议实现onFlushDirty in a Hibernate Interceptor。每当针对每个实体更改将会话刷新到数据库时,就会调用此方法。可以在onFlushDirty方法中检查感兴趣实体和感兴趣属性的对象类型

  2. # 2 楼答案

    使基事件@MappedSuperclass和扩展类@Entity

    所以

    @MappedSuperclass
    public class BaseEvent
    

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