Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @超类中的后加载_Java_Jpa - Fatal编程技术网

Java @超类中的后加载

Java @超类中的后加载,java,jpa,Java,Jpa,我有几个实体类。现在我想在每个实体中使用@PostLoad。每个实体的功能代码都是相同的。因此,我创建了一个超类(公共抽象类AbstractModel{..}),其中包含@PostLoad方法。现在有可能做到这一点吗?在快速测试中,不执行该方法,但将该方法放置在实体中执行。。。也许有人能解决这个问题 @MappedSuperclass public class Parent implements Serializable { @PostLoad public void post

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

@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串行类型),但我认为这没有什么区别。