我有人类,其中包含另一个对象标题。
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可用。
答案 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;
也许它来自这里? :)