【问题标题】:Hibernate, Extending Entity - "java.lang.IllegalArgumentException: Unknown entity"休眠,扩展实体 - “java.lang.IllegalArgumentException:未知实体”
【发布时间】:2018-12-22 11:16:16
【问题描述】:

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

【问题讨论】:

  • 您能否通过从 BaseEvent 中删除表名来将 ExtendedEvent 定义为 Hibernate 实体。
  • @Jackson 我需要定义表名,因为它与类名不同,并且 Hibernate 没有创建数据库。
  • 我可以看到扩展 Hibernate 实体是一个不平凡的问题 我会说相反 - 它是微不足道的。扩展类或嵌入字段。

标签: java hibernate inheritance


【解决方案1】:

制作基础事件@MappedSuperclass 和扩展类@Entity

所以

@MappedSuperclass
public class BaseEvent

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

【讨论】:

  • 谢谢,但不幸的是,这与我想要的相反 - 我想将所有声明保存在一个地方,并且能够保留 BaseEventExtendedEvent
【解决方案2】:

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

【讨论】:

  • 谢谢,这是一个非常酷的功能 - 但不幸的是,在我的情况下,对象在被持久化之前正在以多种方式创建和修改,而这正是我正在工作的阶段。
  • 您也可以使用 Aspects,在 setter 上创建切入点并在应用程序中更新地图
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多