当前位置: 首页 > 知识库问答 >
问题:

Hibernate,扩展实体-“java.lang.IllegalArgumentException:未知实体”

陶博耘
2023-03-14

我有一个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抱怨它不知道什么是< code>ExtendedEvent。

java.lang.IllegalArgumentException: Unknown entity: my.package.ExtendedEvent

我可以看出扩展Hibernate实体是一个不小的问题,尤其是当您开始添加字段时——但是我所希望的是Hibernate将< code>ExtendedEvent视为< code>BaseEvent(因为它就是这样)。对此有简单的解决方法吗?

共有2个答案

满勇军
2023-03-14

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

鲁德佑
2023-03-14

使基本事件< code>@MappedSuperclass和扩展类< code>@Entity

所以

@MappedSuperclass
public class BaseEvent

@Entity
@Table(whatever)
public class ExtendedEvent extends BaseEvent
 类似资料:
  • 我有一个测试车, 而applicatin.xml是 但它报告异常 java.lang.IllegalArgumentException:未知实体:com.chinalbs.entity.conductor(位于org.hibernate.ejb.abstractentyManagerImpl.persist(abstractentyManagerImpl.java:842)(位于sun.refle

  • 问题内容: 我正在尝试使用注释将Spring与Hibernate结合使用,并且出现以下错误: 这是我的设置… 我的实体: 我的豆子: } 我在Spring中启用注释: 当我通过BlazeDS从Flex应用程序调用Foo.addBar方法时收到错误消息。 我真的很想避免其他配置,而且似乎所有这些都可以解决。 我正在使用Spring 3.0.0.RC1,Hibernate Annotations 3.

  • 问题内容: 我有一个包含两个字段的表,我想要两个对象。 第一个只有field1 第二个有两个领域 我使用加载每个 我想做的就是扩展。我将如何去做? 问题答案: 如果要在所需表中保存公共字段,则意味着假设您拥有A类和B类,并且具有一些通用文件(例如created_by,updated_by),并且希望将field1,field2保存在两个实体中:IN数据库级: 对于这种类型的结构,您应该使用@Map

  • 问题内容: 一个运行了几个月的应用程序已经停止使用已经有几个月历史的JPA 批注。在进行集成测试时,我看到许多“ ”类型错误。 我不清楚这里出了什么问题。 我没有文件,因为我正在使用hibernate实体管理器。由于我仅使用注释,因此我的实体没有.hbm.xml文件。我的文件很小,可以正常保存。 我显然丢失了一些东西,但不能动弹。 我正在使用hibernate批注3.2.1,hibernate-e

  • 问题内容: 我收到以下hibernate异常: 简化的Matchup类如下所示: 简化的Team类如下所示: 笔记: 比赛和团队都有子类。我不确定这是否会影响局势。 我的persistence.xml中列出了Matchup和Team都包括在内。 如果我在两个getter方法上都使用@Transient批注,该错误将消失。 谁能阐明为什么会发生这种异常? 问题答案: 我发现了问题:我没有将Team类

  • 问题内容: 我写了一些代码将数据插入SQL数据库。实际上,我正在尝试使用Hibernate学习Struts2。但是,不幸的是,我在提交表格后遇到了问题。 我找不到此错误消息的原因。我的try&catch块引发如下错误: Pojo(): 还具有: 问题答案: 如果未映射实体,则应检查hibernate配置。Hibernate是ORM框架,用于将pojo(实体)映射到数据库架构对象。您没有配置或hib