超类中的@PostLoad

时间:2011-02-24 20:03:55

标签: java jpa

我有几个Entity类。现在我想在每个实体中使用@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](Eclipse   持久性服务 -   2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.ValidationException   异常描述:实体类   [class jpatest.Album]没有主要内容   密钥指定。它应该定义   @Id,@ EmbeddedId或@IdClass。如果   你已经使用其中任何一个定义了PK   注释然后确保你这样做   没有混合访问类型(两者都有   字段和属性注释)   你的实体类层次结构。

3 个答案:

答案 0 :(得分:1)

您无意中切换了访问类型,EclipseLink忽略了字段注释。由于是@PostLoad造成这种情况,我建议归档一个错误。 如果您使用的是JPA 2.0,则可以直接在Album上指定访问类型,或者如果使用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){
        ...
    }
}

答案 1 :(得分:0)

您的AbstractModel是否已使用@MappedSuperclass映射?

答案 2 :(得分:0)

至少“Java Persistence with JPA”表示这应该适用于映射的超类(使用@MappedSuperClass标记AbstractModel)。