如何直接通过Hibernate更新外键值?

问题描述

| 我有几个对象使用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)     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...