Hibernate: не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа

#java #sql #hibernate

#java #sql #спящий режим

Вопрос:

эта ошибка возникает при попытке вставить (сохранить) пользователя, использующего hibernate:

 //SQL
DROP TABLE IF EXISTS `bytecodete`.`account_confirmation`;
CREATE TABLE  `bytecodete`.`account_confirmation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `FK_account_confirmation_1` (`email`),
  CONSTRAINT `FK_account_confirmation_1` FOREIGN KEY (`email`) REFERENCES `user` (`email`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;



// HIBERNATE
@Entity
@Table(name = "account_confirmation", catalog = "bytecodete")
public class AccountConfirmation implements java.io.Serializable {

    private Integer id;
    private User user;

    public AccountConfirmation() {
    }

    public AccountConfirmation(User user) {
        this.user = user;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "email", nullable = false)
    public User getUser() {
        return this.user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
  

Сначала я вставляю объект ‘user’ в базу данных, затем пытаюсь вставить этого пользователя в эту таблицу ‘account_confirmation’, но это невозможно .. я действительно не понимаю, почему это происходит.

Есть идеи?

РЕДАКТИРОВАТЬ: // LOG4J

 Hibernate: 
    insert 
    into
        bytecodete.user
        (email, password, type) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        bytecodete.person
        (birthDate, cpf, gender, idFacebook, name, tokenFacebook, idUser) 
    values
        (?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        bytecodete.account_confirmation
        (email) 
    values
        (?)
18:45:40,745  WARN JDBCExceptionReporter:77 - SQL Error: 1452, SQLState: 23000
18:45:40,746 ERROR JDBCExceptionReporter:78 - Cannot add or update a child row: a foreign key constraint fails (`bytecodete`.`account_confirmation`, CONSTRAINT `FK_account_confirmation_1` FOREIGN KEY (`email`) REFERENCES `user` (`email`) ON DELETE CASCADE ON UPDATE CASCADE)
  

С наилучшими пожеланиями,
Вальтер Энрике.

Комментарии:

1. Разве вы не должны каким-то образом сообщать hibernate, что пользователь является внешним ключом? Возможно, в этом случае связь «один к одному»? Я не уверен, как это сделать с помощью аннотаций. Извините.

2. @hooknc, это не работает, я пробую то, что вы предлагаете, но продолжает возвращаться: не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа ( bytecodete . account_confirmation , ОГРАНИЧЕНИЕ FK_account_confirmation_1 ССЫЛОК НА ВНЕШНИЙ КЛЮЧ ( email ) user ( email ) ПРИ КАСКАДНОМ УДАЛЕНИИ При КАСКАДНОМ ОБНОВЛЕНИИ)

3. Вы должны иметь возможность включить ведение журнала в режиме гибернации, чтобы точно видеть, какой SQL выполняется. Для log4j вы бы использовали «org.hibernate. SQL» при ОТЛАДКЕ. Вы также можете рассмотреть возможность использования «org.hibernate» и при отладке. Должно быть что-то сомнительное с этим отображением вашего пользовательского объекта. Есть ли у вас сопоставление для этого пользовательского объекта и можете ли вы добавить пользователя в свою базу данных?

4. @hooknc, я обновляю свой post и вставляю свой LOG4J, который hibernate выполняет для вставок. Все в порядке, прежде чем пытаться вставить объект user в таблицу account_confirmation, пользователь вставляется в таблицу user, затем я вставляю этого же пользователя в таблицу person, чем пытаюсь вставить этого пользователя в таблицу account_confirmation .. но.. не происходит.

5. можете ли вы также добавить протоколирование для вводимых значений? Я полагаю, вы получили бы это из журнала «org.hibernate» при отладке или трассировке. Возможно, существует разница в регистре между адресом электронной почты’?

Ответ №1:

Вы сохраняете пользователя и подтверждение учетной записи в одном сеансе? Это двунаправленное отношение или просто однонаправленное? (Возможно, вам также следует опубликовать содержимое класса user)