Hibernate Query(JPQL)将新的Object转换为持久/托管对象

时间:2017-09-27 08:45:32

标签: hibernate jpa

我的示例Java EE 7 EJB模块包含2个实体和一个在Wildfly 9.0.2(Hibernate 4.3.10.Final)或10.1.0(Hibernate 5.0.10.Final)上运行的无状态bean

  • Entity Master与Detail
  • 之间存在简单的@Id@OneToMany关系
  • 实体详细信息具有使用@IdClass@ManyToOne与Master
  • 的关系的级联密钥
  • 为方便起见,持久性单元使用内置的jboss / datasources / ExampleDS数据库(schema-generation = drop-and-create),因此启动时DB-Tables都是空的
  • 无状态bean执行简单查询(没有别的)。在flush / commit时,Hibernate会在Master表中插入一行

这是查询

// setup new/unmanaged objects
Master m = new Master('masterkey');
Detail d = new Detail(m, 0);

em.createQuery("select count(d) from Detail d where d=:d")
  .setParameter("d", d)
  .getSingleResult()

情景的变化会导致不同的错误

  • 如果数据库已包含带键'masterkey'的主行,则无状态方法失败,数据库出现重复键错误
  • 如果代码(设置新对象和执行查询)重复,则无状态方法失败并显示Hibernate错误A different object with the same identifier value was already associated with the session : [Master#masterkey]

我在更改查询时找到了一些解决方法,这不是我的问题。但是为什么Hibernate将新的Master对象放入持久化上下文并随后将其插入到数据库中,它只是一个查询?

0 个答案:

没有答案