Я кратко объясню ситуацию. У меня есть 2 объекта, один из которых является владельцем и имеет FK, а другой - присоединенный объект. Ситуация такова, что у владельца может быть связан только один не-владелец, а у не-владельца может быть много владельцев. Тем не менее, я думаю, что мне нужен однонаправленный OneToOne, так как я хочу иметь возможность выполнять все операции CRUD на стороне владельца, но я не хочу, чтобы какой-либо не-владелец обновлялся или удалялся из-за операций, которые я выполняю » делаю с хозяином. Пожалуйста, исправьте меня, если это рассуждение неверно. Итак, вот что у меня есть:
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Column
private fk_id;
// various fields with their getter and setters
@OneToOne
@JoinColumn(name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)
private Child childEntity;
}
@Entity
public class Child{
@Id
@Column(name = "id", updatable = false, nullable = false)
private Long id;
}
Проблемы, с которыми я сталкиваюсь, следующие: - Попытка вставить новых владельцев с действительным fk_id приводит к тому, что идентификаторы для этого класса должны быть назначены вручную перед вызовом save ( ) Я попытался это исправить, но вскоре понял, что это не проблема. У меня возникла эта проблема, потому что при создании нового владельца JPA фактически пытается создать дочерний элемент, связанный с этим родителем, и не может этого сделать, потому что у меня нет стратегии генерации идентификатора (что я и хочу).
После различных попыток я чувствую, что это проблема, я не могу добавить нового родителя, который связан с уже существующим потомком, поскольку для каждого родителя, которого я пытаюсь добавить, JPA пытается добавить соответствующего нового потомка.
Я думал, что исправлю это с помощью однонаправленных отношений OneToOne, но либо я делаю это неправильно, либо что-то еще не так, поскольку однонаправленный OneToOne требует от меня каскадный тип, который мне не нужен.
РЕДАКТИРОВАТЬ : Я пытаюсь вставить нового владельца, который связан с не владельцем, как это:
public Long insertAccount(Owner record) {
insert(record);
return record.getId();
}
public Long insert(T entity) {
entityManager.persist(entity);
return entity.getId();
}
Вставка = false, Updatable = false представляется необходимым, так как fk_id также является столбцом класса.
РЕДАКТИРОВАТЬ 2: Имея в владельце следующее:
@ManyToOne
@JoinColumn(name = "fk_id", insertable = false, updatable = false)
private Child childEntity;
Я получаю следующую ошибку:
object re относится к несохраненному временному экземпляру. Сохраните временный экземпляр перед сбросом
. Есть ли способ исправить его, не добавив параметр каскада? Как я упоминал выше, при добавлении нового владельца я вообще не хочу менять сторону, не являющуюся владельцем.
Еще один пример, о котором я подумал, следующий: Владелец = студенты, имеющие ссылку на университет Не владелец = университет.
Студенческий класс имеет аннотацию @ManyToOne, университетский класс не имеет аннотаций. Я хочу, чтобы это было однонаправлено, я хочу добавить нового студента, который будет иметь ссылку на университет, но я не хочу добавлять другой университет с этим студентом.
Это то, что может показаться, что JPA пытается сделать