#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
ССЫЛОК НА ВНЕШНИЙ КЛЮЧ (user
(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)