2012-09-21 31 views
0

如何在hibernate中使用hql查询级联保存或更新?我怎样才能使用级联更新一些特定的领域,而不是更新所有子表字段?如何在hibernate中使用hql查询级联如何在hibernate中使用hql查询级联保存或更新

例如表用户具有
的userName VARCHAR(10)
密码 VARCHAR(10)

表UserAccessRights具有
用户名 VARCHAR用户表(10)FK
密码 varchar(10)用户表的FK
Authpassword VARCHAR(10)

级联更新应该没有用户名密码才会发生。我该如何实现这个目标?

+0

你能更清楚些吗?代码示例可能很有用。 –

回答

2

你不知道。

由于级联是Hibernate配置问题(即HBM或注释),因此必须将数据返回给Java以处理级联。在HQL中执行UPDATE/DELETE行修改完全发生在SQL服务器上(并且SQL服务器不理解JPA级联,因为JPA是Java API而不是SQL API或SQL标准)。

1

你需要在你的hbm文件中指定你的级联设置。

<set name="columnrecord" cascade="save-update" table="..."...> 
     <key> 
      <column name="COLUMN_NAME" not-null="true" /> 
     </key> 
     <one-to-many class="..." /> 
</set> 
+0

这适用于像会话#保存(对象)和会话#更新(对象)的API,但问题是关于使用HQL API,如会话#createQuery(字符串)。也许你可以引用该API的示例用法,该引用使用引用的HBM XML片段中的级联设置。我不认为你可以但很高兴被教育:) –

+0

嗨Darryl 如果我写一个HQL操纵一个实体,不会休眠读取其相关的配置(无论是在HBM文件或注释的实体类),并执行所需级联? – Ashish

+1

你误解了我的观点。 HQL作为服务器上的一条语句运行,可以完全删除/销毁SQL服务器上的数据(批量操作)。为了让hibernate知道何时执行级联,它需要知道被销毁的数据值何时非空。然后执行其他SQL语句以实现级联操作。我引用Session#save(),#delete()和#update()API等等的一点是,数据被加载到Java内存中,允许休眠程序控制实现'级联'设置。用数据修改HQL这是不可能的。 –

相关问题