Java @超类中的后加载
我有几个实体类。现在我想在每个实体中使用@PostLoad。每个实体的功能代码都是相同的。因此,我创建了一个超类(公共抽象类AbstractModel{..}),其中包含@PostLoad方法。现在有可能做到这一点吗?在快速测试中,不执行该方法,但将该方法放置在实体中执行。。。也许有人能解决这个问题Java @超类中的后加载,java,jpa,Java,Jpa,我有几个实体类。现在我想在每个实体中使用@PostLoad。每个实体的功能代码都是相同的。因此,我创建了一个超类(公共抽象类AbstractModel{..}),其中包含@PostLoad方法。现在有可能做到这一点吗?在快速测试中,不执行该方法,但将该方法放置在实体中执行。。。也许有人能解决这个问题 @MappedSuperclass public class Parent implements Serializable { @PostLoad public void post
@MappedSuperclass
public class Parent implements Serializable
{
@PostLoad
public void postLoad()
{
System.out.println("postLoad called!");
}
}
从父级扩展的我的实体类:
@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](日食)
持久性服务-
2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
异常描述:异常
在搜索时被抛出
使用ClassLoader进行持久化归档:
sun.misc.Launcher$AppClassLoader@11b86e7
内部异常:
javax.persistence.PersistenceException:
例外情况[EclipseLink-28018](日食)
持久性服务-
2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.EntityManagerSetupException
例外情况说明:部署前
持久性单元[JPA_TestPU]
失败了
内部异常:异常
[EclipseLink-7161](日食)
持久性服务-
2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.ValidationException
异常描述:实体类
[class jpatest.Album]没有主
指定了密钥。它应该定义
@Id、@EmbeddedId或@IdClass。如果
您已经使用其中任何一个定义了PK
然后确保您这样做
没有混合访问类型(两者都有)
中注释的字段和属性)
您的实体类层次结构
您的抽象模型是否映射了
@MappedSuperclass
?您的抽象模型是否映射了@MappedSuperclass
?至少“Java Persistence with JPA”说,这在应用于映射的超类时应该起作用(用@MappedSuperclass标记AbstractModel)。至少“Java Persistence with JPA”表示当应用于映射的超类(将AbstractModel标记为@MappedSuperClass)时,这应该可以工作。您无意中切换了访问类型,而EclipseLink忽略了字段注释。由于是@PostLoad导致了这种情况,我建议提交一个bug。
如果您使用的是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){
...
}
}
您无意中切换了访问类型,而EclipseLink忽略了字段注释。由于是@PostLoad导致了这种情况,我建议提交一个bug。 如果您使用的是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){
...
}
}
为了安全起见,您已经注释了抽象父类@Entity或@MappedSuperclass?如果您发布了代码,这将更容易。现在我将其标记为@MappedSuperclass,但现在它抱怨它们在子类中没有主键(子类是实体,而超类是MappedSuperclass)。在子类中,它们是主键。@Stijn请,请,请发布代码?(为什么我要乞求这个?)我发布了:)你能理解吗?为了安全起见,你已经注释了抽象父类@Entity或@MappedSuperclass?如果你发布了你的代码,这会更容易现在我将它标记为@MappedSuperclass,但现在它抱怨它们在子类中没有主键(sub-class是实体,super-class是mappedsuperclass)。在sub-class中,它们是主键。@Stijn请,请,请发布代码?(为什么我必须这样做?)我发布了:)你能找到它吗?我找到了,但在superclass中,我需要定义一个@Id,我不想这么做。。。因为在子类(实体)中,我已经定义了键。但我会在每个实体中复制/粘贴@PostLoad。这很奇怪,我们使用的@mappedsuperclass没有@Id(扩展类自然有@Id),我们从来没有遇到过这个问题(虽然我们使用Hibernate作为JPA实现,但我没有EclipseLink的经验)。作为@GeneratedValue策略,我们使用GenerationType.IDENTITY(数据库中的id为PostgreSQL串行类型),但我认为这没有什么区别。我这样做了,但在超类中我需要定义一个@id,我不想这样做。。。因为在子类(实体)中,我已经定义了键。但我会在每个实体中复制/粘贴@PostLoad。这很奇怪,我们使用的@mappedsuperclass没有@Id(扩展类自然有@Id),我们从来没有遇到过这个问题(虽然我们使用Hibernate作为JPA实现,但我没有EclipseLink的经验)。作为@GeneratedValue策略,我们使用GenerationType.IDENTITY(数据库中的id是PostgreSQL串行类型),但我认为这没有什么区别。