JPA Eclipse无法在merge()调用上更新外键

时间:2014-01-23 18:15:29

标签: java eclipse java-ee jpa jpql

我在很多帖子中发现了这个问题,但我无法找到解决方案。 我有一个实体:

 @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,为什么会发生这种情况?我该如何解决?

1 个答案:

答案 0 :(得分:0)

从异常消息中,它表示您的数据库中有另一个表,名称为user_group。它有一列user_id。此列引用user_id表的UTENTI列。因此,每当您尝试更新此值时,另一个表user_group会在更新引用时面临问题。