Я нашел эту проблему во многих сообщениях, но я не могу найти решение. У меня есть одна сущность:JPA Eclipse не обновляет внешний ключ при вызове merge()
@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;
если я изменить USERID внутри моего лица без боба, а затем вызвать слияние как так:
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? Как я могу его решить?
user_group - это таблица, созданная объединением через userId и groupId, как вы можете видеть в группах сущностей, где она аннотируется. Что мне делать, почему он не обновляется автоматически? – gcc
Я не думаю, что JPA обрабатывает ссылку при обновлении. Итак, сначала вам нужно удалить (или изменить user_id в любые другие значения) строки из user_group, которые ссылаются на user_id. Только тогда вы можете выполнить операцию UPDATE. –
Как я могу изменить user_id i user_group? У меня нет сущности для user_group, потому что она создается как таблица соединений. в чем смысл CascadeType, если он ничего не обновляет? @Sabuj Hassan – gcc