- 报错
java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing
,这个问题应该是在使用@OneToMany时,没有加级联配置,导致一的一方还没保存,就准备保存多方,但没有得到一方的主键。解决方法是在@OneToMany后加入级联配置,如@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
- 当使用@OneToMany单向操作时,需要在@OneToMany下加入
@JoinColumn(name="one_id")
配置,表示在多方的数据表中加入字段关联到一方的ID - 报错
Could not find any META-INF/persistence.xml file in the classpath
,如果没有persistence.xml文件需要在src/main/resources
文件夹下创建META-INF/persistence.xml
文件,如果已经存在该文件,那么可能是文件的输出路径不对,路径应该和src/main/java
的路径一致,请右击项目-Build Path-Configure Build Path…-Java Build Path-Source-查看src/main/resources
的Output folder,双击,将其配置与src/mian/java
的Output folder一致,如图:
- JPQL和HQL语法不太一样,使用HQL查询数据库时可以使用
entityManager.createQuery( "from User", User.class ).getResultList()
,而使用JPQL时需要写成entityManager.createQuery( "from User u", User.class ).getResultList()
- 使用EntityManager对象查询数据时报错
xx is not mapped from
,原因是hql语法是面向对象的,在查询语句的from后面应该是类名,而不是表名,比如em.createQuery("from user", User.calss)
应写成em.createQuery("from User", User.calss)
- 在OneToMany和ManyToOne双向关联中,直接通过EntityManager.remove(Object)删除多方是不行的,需要先从一方的集合中将多方的对象删除,再调用remove()方法从数据库中删除。
- 在一对多双向关联时, 添加多方数据, 并且多方对象的主键不是自增时, 给多方设置完主键后, 把多方添加到一方集合后, 再保存多方对象到数据库时可能会报错误
A different object with the same identifier value was already associated with the session
, 原因是给多方生成了主键, 并添加到了一方, 此时session中已经有了一个对象具有相同的id, 再保存数据库时hibernate就认为有两个不同对象具有了相同的id, 解决方法有2. 1是将多方添加到一方的集合后, 只更新一方的对象. 2.不将多方添加到一方集合, 而只设置多方对一方的引用, 然后保存多方的对象. 还有种方法是将多方的id设为自增, 代码中不设置id, 保存时由数据库生成.
JPA&Hibernate问题记录
最新推荐文章于 2021-08-11 16:23:06 发布