我有几个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 注释然后确保你这样做 没有混合访问类型(两者都有 字段和属性注释) 你的实体类层次结构。
答案 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)。