【问题标题】:@PostLoad in super class超类中的@PostLoad
【发布时间】:2011-02-24 20:03:54
【问题描述】:

我有几个实体类。现在我想在每个实体中使用@PostLoad。每个实体的功能代码都是相同的。所以我创建了一个包含@PostLoad 方法的超类(公共抽象类AbstractModel {..})。现在有可能做到这一点吗?在快速测试中,该方法未执行,但该方法在实体中执行...也许有人对此有解决方法?

@MappedSuperclass
public class Parent implements Serializable
{

    @PostLoad
    public void postLoad()
    {
        System.out.println("postLoad called!");
    }


}

我的继承自 Parent 的实体类:

@Entity
@Table(name = "albums") //de naam van de tabel wordt 'albums'
public class Album extends Parent implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id") //de naam van de kolom wordt 'id'
    private Long id;

...
}

以及运行时的错误:

异常 [EclipseLink-30005] (Eclipse 持久性服务 - 2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 异常描述:异常 在搜索时被抛出 使用 ClassLoader 的持久性归档: sun.misc.Launcher$AppClassLoader@11b86e7

内部异常: javax.persistence.PersistenceException: 异常 [EclipseLink-28018] (Eclipse 持久性服务 - 2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.EntityManagerSetupException

异常描述:预部署 PersistenceUnit [JPA_TestPU] 失败的。

内部异常:异常 [EclipseLink-7161](日食 持久性服务 - 2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.ValidationException 异常描述:实体类 [class jpatest.Album] 没有主 键指定。它应该定义 @Id、@EmbeddedId 或 @IdClass。如果 您已经使用这些中的任何一个定义了 PK 注释然后确保你这样做 没有混合访问类型(两者 字段和属性注释)在 您的实体类层次结构。

【问题讨论】:

  • 为了安全起见,您已经注释了抽象父类@Entity 或@MappedSuperclass?
  • 如果你发布你的代码,这会容易得多
  • 现在我将它标记为@MappedSuperclass 但现在它抱怨它们在子类中没有主键(子类是实体,超类是映射超类)。在子类中,它们是主键。
  • @Stijn 请,请,请发布代码? (我为什么要乞求这个?)
  • 我贴出来了 :) 你能弄清楚吗?

标签: java jpa


【解决方案1】:

您无意中切换了访问类型,而 EclipseLink 忽略了字段注释。因为是@PostLoad 导致了这个问题,所以我建议提交一个错误。 如果您使用的是 JPA 2.0,您可以直接在相册上指定访问类型,或者如果使用 JPA 1.0,只需对属性访问进行注释:

@Entity
@Table(name = "albums") //de naam van de tabel wordt 'albums'
public class Album extends Parent implements Serializable
{
    private static final long serialVersionUID = 1L;

    private Long id;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id") //de naam van de kolom wordt 'id'
    public Long getId(){
        ...
    }

    public Long setId(Long id){
        ...
    }
}

【讨论】:

    【解决方案2】:

    至少“Java Persistence with JPA”说这应该在应用于映射超类时工作(用@MappedSuperClass标记AbstractModel)。

    【讨论】:

    • 我做了,但是在超类中我需要定义一个我不想做的@Id...因为在子类(实体)中我已经定义了键。但是我会在每个实体中复制/粘贴@PostLoad。
    • 这很奇怪,我们使用没有@Id 的@MappedSuperClasses(扩展类自然有@Id),我们从来没有遇到过这个问题(尽管我们使用Hibernate 作为JPA 实现,我没有使用 EclipseLink 的经验)。作为@GeneratedValue-strategies,我们使用GenerationType.IDENTITY(数据库中的id是PostgreSQL Serial-type),但我认为这没有什么区别。
    【解决方案3】:

    您的 AbstractModel 是否与 @MappedSuperclass 进行了映射?

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 2013-10-22
      • 2011-05-28
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多