У меня есть 2 класса: водитель и автомобиль. Таблица автомобилей обновляется в отдельном процессе. Мне нужно иметь свойство в драйвере, что позволяет мне читать полное описание автомобиля и писать только Id, указывающий на существующий автомобиль. Вот пример:JPA отношение много-к-одному - необходимо сохранить только Id
@Entity(name = "DRIVER")
public class Driver {
... ID and other properties for Driver goes here .....
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "CAR_ID")
private Car car;
@JsonView({Views.Full.class})
public Car getCar() {
return car;
}
@JsonView({Views.Short.class})
public long getCarId() {
return car.getId();
}
public void setCarId(long carId) {
this.car = new Car (carId);
}
}
Автомобильный объект является типичным объектом JPA без обратной ссылки на драйвер.
Так что я пытаюсь достичь, это: 1) Я могу прочитать полное описание автомобилей, используя подробные JSON View 2) или я могу читать только Id автомобиля в коротких JsonView 3) и самое главное, при создании нового драйвера я просто хочу передать идентификатор JSON автомобиля. Таким образом, мне не нужно делать unnesessery чтение для автомобиля во время сохранения, но просто обновить Id.
Im получать следующее сообщение об ошибке: «объект ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой: com.Driver.car -> com.Car»
Я не хотят, чтобы обновить экземпляр автомобиля в БДЕ а скорее просто ссылку на него от Driver. Любая идея, как достичь того, чего я хочу?
спасибо.
ОБНОВЛЕНИЕ: Забыл отметить, что идентификатор автомобиля, который я прохожу во время создания Драйвера, является действительным идентификатором существующего автомобиля в БД.
Спасибо Тобб. Так что, если Im создает драйвер из следующего Json {"name": "Joe Doe", "carId": 123}, где автомобиль с идентификатором 123 уже существует, то объект существует в БД. Означает ли это, что я не могу обновить Dirver :: carId, если я не обновляю ссылку на Car также? –
Первое, что связано с JPA, заключается в том, что вам нужно перестать думать в терминах базы данных. JPA имеет дело с объектами Java, это то, что вы запрашиваете, и это то, что вы получаете. У водителя нет атрибута carId, у него есть атрибут Car. Итак, если вы получите эти данные (я думаю, что имя - это имя нового драйвера), сначала вы должны найти EntityManager # find на carId, чтобы получить Car-объект. Затем создайте новый драйвер, присвойте ему загруженный автомобиль и отправьте его в EntityManager # persist. Поскольку автомобиль уже сохраняется и управляется, я не думаю, что вам нужен какой-нибудь каскад, чтобы это сработало. – Tobb
Я вижу. Думаю, для меня нет способа создать объект Car, как и я, и отметить его как сохраненный (подавая его только Id). Похоже на неудобное ограничение для тех, кто приходит из чистого мира запросов БД, где обновление столбца идентификатора - простая задача. Я предполагаю, что другим решением было бы изменить поле CAR_ID от @ManyToOne до базового длинного поля и добавить Transient field Car. Это позволит мне работать только с идентификаторами во время получения и установки, и когда мне нужно будет получить подробную информацию о машине, я могу установить поле «Автомобиль» у контроллера Resuorce, прочитав этот автомобиль явно. Цените свою помощь. –