无法添加或更新子行:外键约束失败
问题描述:
我试图实现与JPA的多对多关系。我有3个表格:无法添加或更新子行:外键约束失败
Korisnik(用户)与:id,username列。 Tim(团队)与:d,名称,desc列。 Korisnik_Tim:korisnik_id,tim_id。
这里是我的实体类:
Korisnik类:
public class Korisnik implements Serializable, AbstractModelObject {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 65535)
@Column(name = "username")
private String username;
@ManyToMany(mappedBy = "korisnikCollection", cascade = CascadeType.ALL)
private Collection<Tim> timCollection;
// Getters and setters
这里是添类:
public class Tim implements Serializable, AbstractModelObject {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 65535)
@Column(name = "name")
private String name;
@Lob
@Size(max = 65535)
@Column(name = "opis")
private String opis;
@JoinTable(name = "tim_korisnik", joinColumns = {
@JoinColumn(name = "korisnik_id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "tim_id", referencedColumnName = "id")})
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Collection<Korisnik> korisnikCollection;
在前端,我想补充团队,并为该团队添加一些用户。
public void save(){
tim = new Tim();
tim.setName(name);
tim.setOpis(desc);
tim.setKorisnikCollection(selectUsers);
databaseBroker.save(tim);
}
这里我试图将数据保存到数据库。
@Override
public void save(AbstractModelObject amo) {
try{
em.merge(amo);
} catch (Exception e){
System.err.println(e.getLocalizedMessage());
}
}
这里是expcetion:
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`nst`.`tim_korisnik`, CONSTRAINT `fk_korisnik` FOREIGN KEY (`korisnik_id`) REFERENCES `korisnik` (`id`) ON UPDATE CASCADE)
Error Code: 1452
Call: INSERT INTO tim_korisnik (tim_id, korisnik_id) VALUES (?, ?)
bind => [2 parameters bound]
Query: DataModifyQuery(name="korisnikCollection" sql="INSERT INTO tim_korisnik (tim_id, korisnik_id) VALUES (?, ?)")
UPDATE: 我想这也有,但是没有效果。
public void save(){
tim = new Tim();
tim.setName(name);
tim.setOpis(desc);
for(int i=0;i<selectUsers.size();i++){
selectUsers.get(i).setTimCollection(Arrays.asList(tim));
}
tim.setKorisnikCollection(usersList);
databaseBroker.save(tim);
}
答
ManyToMany关联是双向的。发展者维持协调双方的一致性是发展者的责任。
您确定“selectUsers”中的所有用户将其“tim”设置为当前tim吗?
Morover我不会设置集合,但我更愿意将所有用户添加到tim集合中。
尽管CASCADE.ALL属性,我会尝试在提交事务之前坚持所有用户。
我用您的建议更新了问题,但我仍然收到相同的错误。你有想法吗? – Zookey
我们可以在日志中看到只有连接表由SQL更新。有时,JPA执行SQL查询的顺序很奇怪。所以你也可以尝试创建用户然后刷新,然后创建团队和刷新然后关联两个实体和提交。 – mvera