Hibernate @ManyToOne违反了外键约束

时间:2015-07-08 06:53:12

标签: java hibernate

我有人类,其中包含另一个对象标题。

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:错误:在表格上插入或更新   “人”违反了外键约束   “fk_9s5vdsvlj3nqy8btf3u1wgvqf”详细信息:Key(titleid)=(0)   表“标题”中没有出现。

我可以传递titleId并且它会起作用,但是我可能没有titleId可用。

3 个答案:

答案 0 :(得分:0)

首先你必须在Title实体中定义OneToMany关系,如下面的

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

然后添加人和标题你必须在标题人员字段上添加人。

Person p=new Person();
p.setName("pqr");
Title t=new Title();
t.setTitle("Mr.");
t.addPersons(p);
p.setTitle(t);
sessionFactory.getCurrentSession().saveOrUpdate(t);

答案 1 :(得分:0)

您使用标题作为ID(实体标题的主键)导致外键违规。试试这个:

 @Entity
 public class Title {

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

    private String title; 
 }

答案 2 :(得分:0)

您对人员ID的定义有误。你有:

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

我认为应该是:

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

也许它来自这里? :)