无法添加或更新子行:外键约束失败

问题描述:

我试图实现与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属性,我会尝试在提交事务之前坚持所有用户。

+0

我用您的建议更新了问题,但我仍然收到相同的错误。你有想法吗? – Zookey

+0

我们可以在日志中看到只有连接表由SQL更新。有时,JPA执行SQL查询的顺序很奇怪。所以你也可以尝试创建用户然后刷新,然后创建团队和刷新然后关联两个实体和提交。 – mvera