问题描述
|
我有几个对象使用Hibernate,BatchTransaction和Transaction映射到数据库中的表。 BatchTransaction的表(batch_transactions)具有对事务的外键引用,名为transaction_id。
过去,我使用过一个批处理运行程序,该批处理运行程序使用内部调用来运行批处理事务,并在事务完成后完成从BatchTransaction到Transaction的引用。插入事务后,我只调用batchTransaction.setTransaction(txn),所以我有一个从BatchTransaction到Transaction的@ManyToOne映射。
我正在更改批处理运行器,以便它通过Web服务执行其事务。新插入的交易记录的ID将由服务返回,我要直接在BatchTransaction中更新transaction_id(而不是在BatchTransaction上的Transaction字段中使用setter,这将需要我不必要地加载新插入的项目) 。
似乎最合乎逻辑的方法是使用SQL而不是Hibernate,但是我想知道是否有更优雅的方法。有任何想法吗?
这是基本的映射。
BatchQuery.java
@Entity
@Table(name = \"batch_queries\")
public class BatchQuery
{
@ManyToOne
@JoinColumn(name = \"query_id\")
public Query getQuery()
{
return mQuery;
}
}
Query.java
@Entity
@Table(name = \"queries\")
public class Query
{
}
这个想法是在不设置BatchQuery对象的\“ query \”属性的情况下更新batch_queries中的query_id列。
解决方法
使用直接SQL更新或HQL更新当然是可行的。
没有看到完整的问题,在我看来,您可能正在对域进行修改,值得在您的域中进行记录。您可能正在使用BatchTransaction,其成员只有TransactionId而不是完整的事务。
如果在其他活动中,BatchTransaction仍将需要对该事务进行处理,我将考虑为TransactionId添加一个单独的映射,并将其作为管理映射(使Transaction关联更新并插入false)。
如果BatchTransaction不再与整个事务有关,则只需在添加TransactionId字段后删除该关联即可。
, 如您所写,我们可以使用SQL来解决上述问题。但是我建议不要通过SQL更新主键。
现在,当您更改密钥时,这意味着您将一起创建一个新对象,为此,您可以先使用上一个密钥删除现有对象,然后尝试使用更新后的密钥(在您的案例transaction_id)