JPA&Hibernate问题记录
- 报错
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()方法从数据库中删除。