我有一个实体,我们称它为 X。(该实体有一个 @Id id)。 实体被映射到一个表,我们称它为:X_TABLE。 它还包含一个
@ManyToOne
@JoinColumn(name = "JOIN_COLUMN")
YClass joinColumn;//another entity
我正在使用以下代码:
X x = new X(xDTO);//just a copy constructor, nothing fancy, without id
x.joinColumn = null;
entityManager.persit(x);
entityManager.flush();
join_column_id = somne_function();//irelevant
Query q = entityManager.createNativeQuery(
"UPDATE X_TABLE t SET t.JOIN_COLUMN=" + join_column_id + " WHERE " + " t.id= " + x.getId());
q.executeUpdate();
q.flush();
如果有人想知道,这样做的关键是 join_column 是另一个表的外键,在不同的数据库中,我通过 native 查询设置它,因为相应的表不存在于包含 X_TABLE 的同一数据库。但这不是问题。实体映射和关系都很好,我可以保证。
上面的代码是针对循环中的几条记录执行的,有时它对所有记录都可以正常工作(保存和更新表格很好)。但有时它对除循环中最后一条记录之外的所有记录都能正常工作(从某种意义上说,它保存了记录, 但不执行数据库中的更新)。 没有抛出异常, hibernate 的 JBoss 服务器调试日志显示使用正确的值进行更新,没有错误。然而,该表在 JOIN_COLUMN 中仅包含一条记录为空,我不知道为什么。有什么想法吗?
PS:该服务是容器管理事务。
最佳答案
一些建议:
- 检查 executeUpdate() 影响的行数
- 你们的交易政策是什么?定义了任何 TransactionManager 吗?
关于java - 表有时不会通过 Hibernate native 查询进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360078/