У меня есть класс, который содержит другой объект. Название.Hibernate @ManyToOne нарушает ограничение внешнего ключа
public class Person {
public Person(){
titleId=new Title();
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private LongId;
@ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER,targetEntity=Title.class)
@JoinColumn(name = "titleId", referencedColumnName = "titleId",columnDefinition="int",nullable=false)
private Title title;
...
...
}
@Entity
public class Title {
@Generated(GenerationTime.INSERT)
@Column(columnDefinition = "serial")
private int titleId;
@Id
private String title; }
Когда я пытаюсь вставить объект Person с деталями ниже.
Person p=new Person();
Title t=new Title();
t.setTitle("Mr.");
p.setName("abc");
p.setTitle(t);
sessionFactory.getCurrentSession().saveOrUpdate(p);
Это работает отлично и вставив название и лицо
Но когда я пытаюсь вставить другой человек с таким же названием, он не
Person p=new Person();
Title t=new Title();
t.setTitle("Mr.");
p.setName("pqr");
p.setTitle(t);
sessionFactory.getCurrentSession().saveOrUpdate(p);
Это дает исключение, как показано ниже
org.postgresql.util.PSQLException: ERROR: insert or update on table "person" violates foreign key constraint "fk_9s5vdsvlj3nqy8btf3u1wgvqf" Detail: Key (titleid)=(0) is not present in table "title".
Я могу передать название Ид, и это сработает, однако есть шанс, что у меня нет titleId avai Lable.
За исключением имени человека, два фрагмента идентичны. Поэтому я не вижу, как можно работать, а другой - нет. Если цель состоит в том, чтобы связать человека с * существующим * названием, вам нужна ссылка на этот * существующий * заголовок, так или иначе получая его из базы данных. Вы не должны создавать новый, как ваш код. –
Спасибо за ответ. Таким образом, hibernate автоматически не обнаружит, что он уже существует и использует его? Я должен вручную проверять каждый раз, если существует, а затем использовать его или создать новый? SaveOrUpdate не будет сохранять или обновлять дочерние объекты? –
Нет, не будет. Единственное, что однозначно идентифицирует объект, это его идентификатор. Вы вполне можете захотеть двух идентичных экземпляров Title, отличающихся только их идентификатором. –