JPA&Hibernate问题记录

8 篇文章 0 订阅
4 篇文章 0 订阅
  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()方法从数据库中删除。
  7. 在一对多双向关联时, 添加多方数据, 并且多方对象的主键不是自增时, 给多方设置完主键后, 把多方添加到一方集合后, 再保存多方对象到数据库时可能会报错误A different object with the same identifier value was already associated with the session, 原因是给多方生成了主键, 并添加到了一方, 此时session中已经有了一个对象具有相同的id, 再保存数据库时hibernate就认为有两个不同对象具有了相同的id, 解决方法有2. 1是将多方添加到一方的集合后, 只更新一方的对象. 2.不将多方添加到一方集合, 而只设置多方对一方的引用, 然后保存多方的对象. 还有种方法是将多方的id设为自增, 代码中不设置id, 保存时由数据库生成.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值