Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 &引用;不知道是否传递了类名。。。“安全吗?”;在Hibernate中使用JPA EmbeddedId_Java_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Java &引用;不知道是否传递了类名。。。“安全吗?”;在Hibernate中使用JPA EmbeddedId

Java &引用;不知道是否传递了类名。。。“安全吗?”;在Hibernate中使用JPA EmbeddedId,java,hibernate,jpa,jpa-2.0,Java,Hibernate,Jpa,Jpa 2.0,在教程中提供的示例代码的一个非常精练的版本中,我得到: javax.persistence.PersistenceException:[PersistenceUnit:unit]无法构建Hibernate SessionFactory 位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877) 位于o

在教程中提供的示例代码的一个非常精练的版本中,我得到:

javax.persistence.PersistenceException:[PersistenceUnit:unit]无法构建Hibernate SessionFactory
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877)
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:805)
在org.hibernate.jpa.HibernatePersistenceProvider.createEntityManager工厂(HibernatePersistenceProvider.java:58)
位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:55)
位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:39)
在[我对学生调用e.persist的代码]
该异常相当普遍,但Hibernate提供了一些很好的日志调试信息(我已将实际的包名替换为):

[DEBUG]org.hibernate.boot.internal.ClassLoaderAccessImpl:不知道传递的类名[.Student]是否安全
[调试]org.hibernate.boot.internal.ClassLoaderAccessImpl:未提供临时类加载器;使用live ClassLoader加载可能不安全的类:。Student
这是经过提炼的代码。(背景故事是,我一直在尝试创建一个带有嵌入id的实体,但没有成功。在尝试调试一段时间后,我重新开始使用本教程代码,删除一些内容,直到出现相同的错误。)


可嵌入类需要可序列化。更新StudentId的定义以实现Serializable(并添加serialVersionUID),问题似乎消失了:

@Embeddable
class StudentId implements Serializable {

    private static final long serialVersionUID = -7415410969017941320L;

    // ...
}
一旦我发现了这一点,我就能够做更多的研究,但它的帮助程度各不相同。例如,讨论实体类是否需要序列化。一般来说,他们不会。另一个问题更为相关,但使id类不可序列化会产生与我得到的不同的错误消息

年,用户OndrejM指出,它找到了JPA1.0规范中规定复合键类必须可序列化的部分。为完整起见,后续规范中的相关部分为:

2.4主键和实体标识 …以下规则适用于复合主键:

  • 主键类必须是可序列化的

我已经发布了一个对我有用的帖子,但我很高兴能有一个更权威的答案来解释根本的问题。一般来说,实体类不需要序列化,只有当它们需要通过RMI(调用远程EJB)传递到远程系统时才需要。然而,JPA规范明确要求复合键是可序列化的,原因我不知道。更多信息请参见。@Joshua Taylor我很乐意帮忙。从我的评论中添加答案很好,就这样吧。
@Entity
public class Student {
    @EmbeddedId
    private StudentId id;

    public Student() {}

    public Student(int id) { this.id = new StudentId(id); }
}
@Embeddable
class StudentId implements Serializable {

    private static final long serialVersionUID = -7415410969017941320L;

    // ...
}