Как вы обновляете значение внешнего ключа напрямую через Hibernate? - PullRequest
2 голосов
/ 13 июня 2011

У меня есть пара объектов, которые сопоставляются с таблицами в базе данных, используя Hibernate, BatchTransaction и Transaction.Таблица BatchTransaction (batch_transactions) имеет ссылку на внешний ключ для транзакций с именемaction_id.

В прошлом я использовал пакетный обработчик, который использовал внутренние вызовы для запуска пакетных транзакций и завершал ссылку из BatchTransaction на Transaction, как толькотранзакция завершена.После того, как транзакция была вставлена, я просто вызываю batchTransaction.setTransaction (txn), поэтому у меня есть отображение @ManyToOne из BatchTransaction в Transaction.

Я изменяю пакетный исполнитель, чтобы он выполнял свои транзакции через Интернетоказание услуг.Идентификатор недавно вставленной транзакции будет возвращен службой, и я хочу обновить транзакцию_id в BatchTransaction напрямую (вместо того, чтобы использовать установщик для поля транзакции в BatchTransaction, что потребовало бы от меня ненужной загрузки нового вставленного элемента).

Кажется, что наиболее логичный способ сделать это - использовать 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
{
}

Идея заключается вобновить столбец query_id в batch_queries без установки свойства «query» для объекта BatchQuery.

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Использование прямого обновления SQL или обновления HQL, безусловно, возможно.

Не видя полной проблемы, мне кажется, что вы вносите изменения в свой домен, которые стоит документировать в своем домене. Возможно, вы переходите к BatchTransaction, в качестве члена которой используется только TransactionId, а не полная транзакция.

Если в других действиях BatchTransaction по-прежнему нужно будет гидрировать эту транзакцию, я бы рассмотрел добавление отдельного сопоставления для TransactionId и наличие этого управляющего сопоставления (сделайте обновление сопоставления транзакции и вставьте false).

Если BatchTransaction больше не будет касаться полной транзакции, просто удалите эту ассоциацию после добавления поля TransactionId.

0 голосов
/ 13 июня 2011

Как вы уже написали, мы можем использовать SQL для решения вышеуказанной проблемы.Но я предлагаю не обновлять первичные ключи с помощью SQL.

Теперь, когда вы меняете ключ, это означает, что вы полностью создаете новый объект, для этого вы можете сначала удалить существующий объектпредыдущий ключ, а затем попробуйте вставить новый объект с обновленным ключом (в вашем случаеaction_id)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...