2014-01-23 4 views
-1

Я нашел эту проблему во многих сообщениях, но я не могу найти решение. У меня есть одна сущность: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? Как я могу его решить?

ответ

0

Из сообщения об исключении, он говорит, что у вас есть другая таблица в вашей базе данных, имя user_group. Он имеет столбец user_id. Этот столбец ссылается на столбец user_id таблицы UTENTI. Таким образом, всякий раз, когда вы пытаетесь обновить это значение, другая таблица user_group сталкивается с проблемой по мере обновления ссылки.

+0

user_group - это таблица, созданная объединением через userId и groupId, как вы можете видеть в группах сущностей, где она аннотируется. Что мне делать, почему он не обновляется автоматически? – gcc

+0

Я не думаю, что JPA обрабатывает ссылку при обновлении. Итак, сначала вам нужно удалить (или изменить user_id в любые другие значения) строки из user_group, которые ссылаются на user_id. Только тогда вы можете выполнить операцию UPDATE. –

+0

Как я могу изменить user_id i user_group? У меня нет сущности для user_group, потому что она создается как таблица соединений. в чем смысл CascadeType, если он ничего не обновляет? @Sabuj Hassan – gcc

Смежные вопросы