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

Java 如何通过Hibernate直接更新外键值?,java,hibernate,Java,Hibernate,我有两个对象,它们使用Hibernate、BatchTransaction和Transaction映射到数据库中的表。BatchTransaction的表(batch_transactions)有一个对事务的外键引用,名为transaction_id 在过去,我使用了一个批处理运行程序,它使用内部调用来运行批处理事务,并在事务完成后完成从一个批处理事务到另一个事务的引用。插入事务后,我只调用batchTransaction.setTransaction(txn),因此我有一个从batchTran

我有两个对象,它们使用Hibernate、BatchTransaction和Transaction映射到数据库中的表。BatchTransaction的表(batch_transactions)有一个对事务的外键引用,名为transaction_id

在过去,我使用了一个批处理运行程序,它使用内部调用来运行批处理事务,并在事务完成后完成从一个批处理事务到另一个事务的引用。插入事务后,我只调用batchTransaction.setTransaction(txn),因此我有一个从batchTransaction到事务的@ManyToOne映射

我正在更改批处理运行程序,以便它通过Web服务执行其事务。服务将返回新插入事务的ID,我希望直接更新BatchTransaction中的事务\u ID(而不是使用BatchTransaction上事务字段的setter,这将要求我不必要地加载新插入的项)

看起来最合乎逻辑的方法是使用SQL而不是Hibernate,但我想知道是否有更优雅的方法。有什么想法吗


这是基本的映射

BatchQuery.java

@Entity
@Table(name = "batch_queries")
public class BatchQuery
{
    @ManyToOne
    @JoinColumn(name = "query_id")
    public Query getQuery()
    {
        return mQuery;
    }
}
@Entity
@Table(name = "queries")
public class Query
{
}
Query.java

@Entity
@Table(name = "batch_queries")
public class BatchQuery
{
    @ManyToOne
    @JoinColumn(name = "query_id")
    public Query getQuery()
    {
        return mQuery;
    }
}
@Entity
@Table(name = "queries")
public class Query
{
}

其思想是在批处理查询中更新查询id列,而无需在批处理查询对象上设置“query”属性。

如您所述,我们可以使用SQL实现上述问题的解决方案。但我建议不要通过SQL更新主键


现在,当您更改密钥时,这意味着您将一起创建一个新对象,为此,您可以首先使用上一个密钥删除现有对象,然后尝试使用更新的密钥插入一个新对象(在您的情况下是事务id)

,使用直接SQL更新或HQL更新当然是可行的

没有看到完整的问题,在我看来,您可能正在对您的域进行修改,这值得在您的域中记录。您可能正转向拥有一个BatchTransaction,它的成员只有TransactionId,而不是完整的事务

如果在其他活动中,批处理事务仍需要水合物事务处理,我会考虑为事务处理添加单独的映射,并将其作为管理映射(使事务关联更新和插入false)。p>


如果BatchTransaction将不再与完整事务相关,只需在TransactionId字段中添加一个变量后删除该关联即可

也许你可以把HBM文件作为参考,然后我们可以看看。我没有HBM文件,因为我使用注释。不过我会添加映射。