JPA, не хотите вставляемый =false, обновляемый =false, обходной путь?
Я новичок как в stackru, так и в JPA, поэтому постараюсь объяснить это как можно лучше.
В сущности я хочу установить внешний ключ, задав значение int, но я также хочу установить его, задав объект. Вот некоторый код, чтобы объяснить это лучше.
@Entity
public class Thread implements Serializable {
@ManyToOne
@JoinColumn(name = "accountId", referencedColumnName = "id", nullable = false)
public Account getAccount() {
return account;
}
@Column(name = "accountId")
@Basic
public int getAccountId() {
return accountId;
}
}
Я пробовал несколько способов, но приведенный выше код - лучший пример того, чего я пытаюсь достичь. Я понимаю, что установка insert = false и update = false в любом из двух методов заставляет этот код работать вплоть до компиляции и запуска. Но я хочу иметь возможность вставить accountId с помощью объекта Account И, установив фактический int accountId.
Причина этого в том, что иногда на моем сервере у меня есть только accountId, а иногда - объект Account.
Я также понимаю, что лучшим решением, вероятно, является использование account.getId() при создании потока и настройке accountId. Но было бы логично, чтобы на моем сервере можно было просто использовать объект.
Заранее спасибо!
1 ответ
Я думаю, что вы столкнулись с концептуальной проблемой в вашем приложении. Вы должны придерживаться, чтобы установить сущность и не использовать значения внешнего ключа при использовании JPA. Причина проблемы в том, что ваше приложение в какой-то момент предоставляет только accountId.
Это может быть связано с разными причинами. Если это происходит из-за того, что часть приложения, предоставляющая только accountId, является устаревшей, то я думаю, что было бы прекрасно иметь адаптер, который преобразует accountId в сущность Account и затем устанавливает эту сущность. Также не значит, что адаптер может создать прокси JPA, так что в этот момент не требуется фактический доступ к базе данных. Другая причина, по которой я могу думать, заключается в том, что приложение теряет информацию в какой-то момент во время обработки. Это может быть в том случае, когда приложение использует Учетную запись в каком-то месте и передает только свой идентификатор соответствующему коду. Затем такой код должен быть реорганизован для передачи объекта.
В вашем конкретном случае вы также можете использовать и учетную запись как сущность, и внешний ключ как атрибут с возможностью вставки и обновления. Вам просто нужно убедиться, что значение атрибута accountId соответствует внешнему ключу, указывающему на строку, представленную объектом account. JPA-провайдеры должны иметь возможность справиться с этим (я знаю, OpenJPA, например). Однако вы немного ограничены этим. Например, вы можете только прочитать значение атрибута accountId, потому что установка его на другое значение вызовет несоответствие между значением сущности account.