我在很多帖子中发现了这个问题,但我无法找到解决方案。 我有一个实体:
@Entity
@Table(name="UTENTI")
@NamedQueries({
@NamedQuery(name="Utenti.findAll", query="SELECT u FROM Utenti u"),
@NamedQuery(name="Utenti.findByEmail", query="SELECT u FROM Utenti u WHERE u.userId = :mail")
})
public class Utenti implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="ID_UTENTE", nullable = false)
@GeneratedValue(strategy=GenerationType.AUTO)
private BigDecimal id;
@Column(name="USER_ID",unique=true)
private String userId;
private String cognome;
@Temporal(TemporalType.DATE)
private Date dataDiNascita;
private String nome;
private String password;
private String ruolo;
@OneToMany(mappedBy="user",cascade=CascadeType.ALL)
private List<Form> forms;
@ManyToMany(mappedBy="users",cascade=CascadeType.ALL)
private List<Groups> groups;
@OneToMany(mappedBy="utente",cascade=CascadeType.ALL)
private List<CodicePromozionale> codes;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL)
private List<PacchettoAcquistato> acquisti;
/*getters and setters*/
和另一个实体:
@Entity
@Table(name="GROUPS")
public class Groups implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="GROUPID", nullable=false)
private String groupId;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="USER_GROUP",joinColumns={@JoinColumn(name="GROUPID",referencedColumnName="GROUPID")},inverseJoinColumns={@JoinColumn(name="USERID",referencedColumnName="USER_ID")})
private List<Utenti> users;
如果我在无状态bean中更改userId,然后像这样调用merge:
this.user.setUserId(newUserId);
this.em.merge(user);
其中this.em是EntityManager
我收到此错误:
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507- 3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`traveldreamdb`.`user_group`, CONSTRAINT `FK_USER_GROUP_USERID` FOREIGN KEY (`USERID`) REFERENCES `UTENTI` (`USER_ID`))
Error Code: 1451
Call: UPDATE UTENTI SET USER_ID = ? WHERE (ID_UTENTE = ?)
bind => [2 parameters bound]
如果我指定了cascadeType.ALL,为什么会发生这种情况?我该如何解决?
答案 0 :(得分:0)
从异常消息中,它表示您的数据库中有另一个表,名称为user_group
。它有一列user_id
。此列引用user_id
表的UTENTI
列。因此,每当您尝试更新此值时,另一个表user_group
会在更新引用时面临问题。