Custom OneToOne Hibernate / JPA Ассоциация - PullRequest
2 голосов
/ 26 августа 2009

У меня есть база данных, которая может иметь различные типы отношений в зависимости от того, какие данные были обновлены во время последней бизнес-транзакции. Примером может служить приложение для написания политики. Основная таблица содержит общую информацию об уровне политики, и есть связанные таблицы, содержащие такую ​​информацию, как информация об агенте и информация о страхователях. При выполнении первой транзакции все таблицы заполняются, однако в последующих транзакциях только таблицы, которые имеют обновления, сохраняются в базе данных. Сейчас я пытаюсь создать классы, реализующие JPA, которые определяют отношения между таблицами как один к одному. Затем я хотел бы реализовать пользовательские загрузчики для каждого из отношений, чтобы каждый раз, когда я получаю объект политики, я мог получать самую последнюю версию соответствующих таблиц. Кто-нибудь знает, как реализовать эту логику? Я пытался использовать @NamedNativeQuery и HQL, но в обоих случаях он говорит мне, что имя столбца, который я указываю, не существует.

Любая помощь будет принята с благодарностью.

Код предоставлен ниже, чтобы проиллюстрировать, что я делаю.

@Entity
@NamedNativeQuery(name = "loadLatestBilling",
                  query = "Select {i.*} from TransactionSummary as ts outer join BillingInfo i on i.systemAssignId=ts.systemAssignId where ts.systemAssignId=:systemAssignId and i.transSeqNo<=:transSeqNo order by i.systemAssignId, i.transSeqNo DESC",
                  resultClass = BillingInfo.class)

public class CoTransactionSummary implements java.io.Serializable,
    CdbCoTransactionSummary {


@OneToOne(targetEntity = BillingInfo.class, fetch = FetchType.LAZY)
@org.hibernate.annotations.NotFound(action = org.hibernate.annotations.NotFoundAction.IGNORE)
@Loader(namedQuery = "loadLatestBilling")
public BillingInfo getBillingInfo() {
    return billingInfo;
}

public void setBillingInfo(BillingInfo billingInfo) {
    this.billingInfo= billingInfo;
}

}

В приведенном выше примере SystemAssignId будет общим для всех записей, относящихся к этому объекту. Значение transSeqNo будет увеличиваться для каждой последующей транзакции, и, таким образом, пользовательский загрузчик будет искать самое высокое значение, связанное с systemAssignId.

Большое спасибо за любую помощь, которую вы можете оказать.

1 Ответ

2 голосов
/ 26 августа 2009

Ваш именованный запрос неверен - в нем нельзя указывать именованные параметры. У вас может быть только один позиционный параметр, который будет заменен значением первичного ключа (ну, может быть, для составных идентификаторов может быть более одного, но это не применимо в вашем случае). Я также не считаю законным возвращать более одного значения из него; хотя Hibernate может позволить ему скользить.

Теперь, поскольку запрос должен основываться на PK (BillingInfo PK), будет непросто делать то, что вы хотите, с помощью сопоставления один-к-одному (если, конечно, вы не намереваетесь на самом деле обновить CoTransactionSummary каждый раз указывать на соответствующий BillingInfo, но в этом случае вам не нужны все эти пользовательские элементы загрузки). В основном вам нужно будет переписать ваш запрос, чтобы дважды присоединиться к таблице BillingInfo - первый раз, чтобы получить TransactionSummary PK из BililngInfo записи с PK, предоставленной Hibernate, и второй раз, чтобы получить последнюю запись BillingInfo. Все это выглядит довольно грязно.

Попробуйте вместо этого использовать сопоставление one-to-many (вы всегда можете сделать коллекцию BillingInfo частной и предоставить доступ к соответствующему экземпляру только с помощью общедоступного метода getBillingInfo()).

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