2015-07-08 2 views
0

У меня есть класс, который содержит другой объект. Название.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.

+0

За исключением имени человека, два фрагмента идентичны. Поэтому я не вижу, как можно работать, а другой - нет. Если цель состоит в том, чтобы связать человека с * существующим * названием, вам нужна ссылка на этот * существующий * заголовок, так или иначе получая его из базы данных. Вы не должны создавать новый, как ваш код. –

+0

Спасибо за ответ. Таким образом, hibernate автоматически не обнаружит, что он уже существует и использует его? Я должен вручную проверять каждый раз, если существует, а затем использовать его или создать новый? SaveOrUpdate не будет сохранять или обновлять дочерние объекты? –

+0

Нет, не будет. Единственное, что однозначно идентифицирует объект, это его идентификатор. Вы вполне можете захотеть двух идентичных экземпляров Title, отличающихся только их идентификатором. –

ответ

0

Сначала Вы должны определить OneToMany отношения в названии объект что-то вроде ниже

@Entity 
public class Title { 
    @OneToMany(mappedBy="title", cascade = CascadeType.ALL,  orphanRemoval=true, fetch=FetchType.LAZY) 
private List<Person> persons = new ArrayList<Person>(); 
} 

Затем добавить лицо и должность, вы должны добавить человек на поле названия лиц.

+0

Спасибо, Риши, я хочу только одностороннее отношение. Я не нуждаюсь в объектах людей под титульным классом. Тем не менее я пробовал, но не повезло. –

0

У вас есть нарушение внешнего ключа, потому что вы используете заголовок как id (первичный ключ названия объекта). Попробуйте следующее:

@Entity 
public class Title { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int titleId; 

    private String title; 
} 
+0

Я не добавил его цели полностью, я хочу сохранить первичный ключ «Заголовок» и «TitleId» будут сгенерированы базой данных с использованием серийного типа pg. Я не получаю нарушение титульного объекта, но попадаю на объект человека. –

0

У вас есть ошибка в определении вашего идентификатора человека. У вас есть:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private LongId; 

Я думаю, что это должно быть:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long Id; 

Может быть АМСВО отсюда? :)

Смежные вопросы