我有几个使用Hibernate,BatchTransaction和Transaction映射到数据库中的表的对象。 BatchTransaction的表(batch_transactions)具有对事务的外键引用,名为transaction_id。
在过去,我使用了一个批处理运行器,它使用内部调用来运行批处理事务,并在事务完成后完成从BatchTransaction到Transaction的引用。在插入Transaction之后,我只调用batchTransaction.setTransaction(txn),所以我有一个从BatchTransaction到Transaction的@ManyToOne映射。
我正在更改批处理运行器,以便它通过Web服务执行其事务。服务器将返回新插入的Transaction的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
{
}
我们的想法是更新batch_queries中的query_id列,而不在BatchQuery对象上设置“query”属性。
答案 0 :(得分:1)
使用直接SQL更新或HQL更新肯定是可行的。
没有看到完整的问题,我认为您可能正在对您的域进行修改,值得在您的域中进行记录。您可能正在转向具有TransactionId成员而不是完整事务的BatchTransaction。
如果在其他活动中,BatchTransaction仍然需要对该Transaction进行水合,我会考虑为TransactionId添加一个单独的映射,并将其作为管理映射(使Transaction关联更新并插入false)。
如果BatchTransaction不再关注完整的Transaction,只需在添加TransactionId字段后删除该关联。
答案 1 :(得分:0)
正如您所写,我们可以使用SQL来解决上述问题。但我建议不要通过SQL更新主键。
现在,当您更改密钥时,这意味着您要创建一个新对象,为此,您可以先使用上一个密钥删除现有对象,然后尝试使用更新的密钥插入新对象(在你的情况下是transaction_id)