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;
// ...
}