JPA&Hibernate问题记录

  1. 报错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)
  2. 当使用@OneToMany单向操作时,需要在@OneToMany下加入@JoinColumn(name="one_id")配置,表示在多方的数据表中加入字段关联到一方的ID
  3. 报错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一致,如图:
    JPA&Hibernate问题记录
  4. JPQL和HQL语法不太一样,使用HQL查询数据库时可以使用entityManager.createQuery( "from User", User.class ).getResultList(),而使用JPQL时需要写成entityManager.createQuery( "from User u", User.class ).getResultList()
  5. 使用EntityManager对象查询数据时报错xx is not mapped from,原因是hql语法是面向对象的,在查询语句的from后面应该是类名,而不是表名,比如em.createQuery("from user", User.calss)应写成em.createQuery("from User", User.calss)
  6. 在OneToMany和ManyToOne双向关联中,直接通过EntityManager.remove(Object)删除多方是不行的,需要先从一方的集合中将多方的对象删除,再调用remove()方法从数据库中删除。