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一致,如圖:
    這裏寫圖片描述
  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()方法從數據庫中刪除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章