问题出在标题中.下面我刚才描述了我的一些想法和发现.
当我有非常简单的域模型(没有任何关系的3个表)时,我的所有实体都没有实现Serializable.
但是当域模型变得更复杂时,我得到了RuntimeException,它说我的一个实体没有实现Serializable.
我使用Hibernate作为JPA实现.
我想知道:
如果我创建一个复合id类,它不实现Serializable,如:
@Entity
@Table(name = "board")
public class Board {
@Id
@Column(name = "keyword_news_id")
private int id;
@Id
@Column(name = "board_no")
private int boardNo;
....
Run Code Online (Sandbox Code Playgroud)
错误发生如下:
Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.estinternet.news.domain.IssueNewsBoard
at org.hibernate.mapping.RootClass.checkCompositeIdentifier(RootClass.java:263)
at org.hibernate.mapping.RootClass.validate(RootClass.java:244)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
Run Code Online (Sandbox Code Playgroud)
Hibernate实体类不需要是Serializable.那么,为什么composite-id类必须实现Serializable?我读了这个帖子,但它没有给我足够的信息.
我目前正在使用条件来检索用户的详细信息,但在尝试使用正确的用户查询详细信息对象时,我得到了ClassCastException.
我的标准代码;
Criteria criteria = sess.createCriteria(UserDetails.class)
criteria.add(Restrictions.eq("user.id", user.id));
Run Code Online (Sandbox Code Playgroud)
我也试过用;
Criteria criteria = sess.createCriteria(UserDetails.class)
Criteria subCriteria = criteria.createCriteria("user");
subCriteria.add(Restrictions.eq("id", user.id));
Run Code Online (Sandbox Code Playgroud)
两者都给我ClassCastException.我知道我可以通过让用户实现Serializable来轻松解决它,但还有其他解决方案吗?
public class ExampleEntity implements Serializable
{
@Id
private long id;
private int fieldInt;
private long fieldLong;
private String fieldString;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找JPA教程.我能够理解基本概念,但在他们添加的所有教程中,这可序列化.这样做的目的是什么?这对我有什么帮助?有什么建议吗?
我正在使用 Spring 构建一个 Web 应用程序,现在我有一个实体、一个存储库、一个 RestController,并且我可以在浏览器中访问端点。
我现在正在尝试将 JSON 数据返回到浏览器,并且我在各种指南中看到了有关 DTO 的所有内容。
我真的需要 DTO 吗?我不能将序列化逻辑放在实体本身上吗?
在教程中提供的示例代码的非常精简版本中,嵌入式复合主键:主键«JPA«Java教程,我得到:
javax.persistence.PersistenceException: [PersistenceUnit: unit] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:805)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at [my code that calls e.persist on a Student]
Run Code Online (Sandbox Code Playgroud)
异常是相当通用的,但Hibernate提供了一些很好的日志调试信息(我用<package>替换了实际的包名):
[DEBUG] org.hibernate.boot.internal.ClassLoaderAccessImpl: Not known whether passed class name [<package>.Student] is safe
[DEBUG] org.hibernate.boot.internal.ClassLoaderAccessImpl: No temp ClassLoader provided; using live ClassLoader for loading potentially unsafe class : <package>.Student
Run Code Online (Sandbox Code Playgroud)
这是蒸馏代码.(背景故事是我一直试图创建一个具有嵌入式id的实体无效.经过一段时间尝试调试之后,我重新开始使用这个教程代码,删除内容直到我得到相同的错误.)
@Embeddable
class StudentId {
private int id;
public StudentId() {}
public StudentId(int id) { this.id = id; }
@Override
public boolean …
Run Code Online (Sandbox Code Playgroud) 正如我们在 java 中所知,这里使用Serialization
引用博客
将对象的状态转换为字节流,该字节流可以持久保存到磁盘/文件中或通过网络发送到任何其他正在运行的 Java 虚拟机。
现在考虑第二种情况,通过网络发送到另一个正在运行的 jvm ,如果我们考虑Rest API的示例,即“主机:端口/路径/资源”。
通常我使用 Spring@RequestMapping
将资源模型 pojo 类返回为ResponseEntity
. 我没有在Serializable
模型类中实现接口,一切正常,我得到了 json 中的 API 响应。
ModelX.java
public class ModelX {
private int x = 2 ;
private String xs = "stringx";
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
控制器方法:
@RequestMapping(value = "/test",method=RequestMethod.POST)
public ResponseEntity<ModelX> getTestModel(@RequestBody ModelX mox){
ModelX mx = new ModelX();
mx.setX(mox.getX());
mx.setXs(mox.getXs());
return new ResponseEntity<ModelX>(mx, HttpStatus.OK) ; …
Run Code Online (Sandbox Code Playgroud) 我是hibernate的新手.我尝试了一些使用hibernate API的基本CRUD操作.
我创建了一个Person类
@Entity
class Person
{
String name
}
Run Code Online (Sandbox Code Playgroud)
我能够在数据库中保存这个类.直到现在我才认为JPA内部使这个类实现Serializable,因为只有序列化才能保存对象的状态.但是我试过这个:
Person p=new Person();
boolean bool=p instanceof Serializable;
sop(bool); //false
Run Code Online (Sandbox Code Playgroud)
然后我创建了另一个类Human(在Hibernate doc上找到了这种实现方式)
@Entity
class Human implements Serializable
{
String name
}
Human h=new Human();
boolean bool=h instanceof Serializable
sop(bool); //true
Run Code Online (Sandbox Code Playgroud)
我们应该以哪种方式创建我们的域类以及hibernate如何在内部处理这两种方式?
请帮忙.