Witam,
Zmuszony jestem prosić o pomoc/radę, zatrzymałem się na poniższym problemie i od tygodnia nie mogę kontynuować -:(
Stan obecny w kodzie JSF/JPA:
2 encje = klasa POJO z polami odpowiadającymi polom formularza zapisu z web (Student
) oraz klasa reprezentująca stan aktywacji danego użytkownika w systemie (UserActivation
): poniżej ekstrakty bez getterów i setterów pól definiujących i łączących klucze główne i obce; w załączeniu schemat MySQL dla 2 tabel w relacji 1-1 oraz zrzut debuggingu z konsoli Wfly-a rzuca wyjątek :
Cannot add or update a child row: a foreign key constraint fails (`paw_news`.`signatories_activation`, CONSTRAINT `signatories_activation_ibfk_1` FOREIGN KEY (`id`) REFERENCES `signatories` (`id`) ON UPDATE CASCADE)
Problem:
O ile kod zapisuje dane z formatki rejestracyjnej do tabeli signatories
bez problemu ,to nie pozwala na równoległy zapis do tabeli signatories_activation
połączonej relacją 1-1.
Co ciekawe jeśli usunę w MYSQL klucz obcy z tabeli signatories_activation , to kod zapisze dane do dwóch tabel, z tym że w signatories_activation
w polach klucz podstawowy i obcy ustawi wartość 0
.
Zapis dla powyższego schematu zrealizowałem podobnie jak Pan pokazywał na ćwiczeniach: najpierw do tabeli z formularza poprzez studentService
i ...Dao a potem do tabeli signatories_activation
poprzez studentService
i ...Dao.
Może gdzieś w kodzie JPA trzeba wskazać, że generowana wartość w polu signatories.id
ma być zapisana w polu signatories_activation.id
. Załączam schemat bazy MySQL.
package paw.signup.jpa;
import javax.jws.soap.SOAPBinding;
import javax.persistence.*;
@Entity
@Table(name = "signatories")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable=false)
private long id;
@OneToOne
@JoinColumn(name="id")
private UserActivation userActivation;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
..itd
package paw.signup.jpa;
import javax.persistence.*;
@Entity
@Table(name = "signatories_activation")
public class UserActivation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "activation_id",nullable=false)
private long activation_id;
@Column(name = "activated",nullable=false)
private String activated;
@Column(name = "id",nullable=false)
private long id;
@OneToOne(mappedBy="userActivation")
private Student student;
..itd
2018-07-12 23:23:42,603 INFO [StudentDatabaseBean] (default task-3) utw�rz wywo�anie dla: Student{firstName='Manuela', id=0, lastName='Pyza'}
2018-07-12 23:23:43,612 INFO [stdout] (default task-3) Hibernate: insert into signatories (apartment_number, city, county, identity_card, email, first_name, gender, house_number, iban_account, last_name, login, password, personal_id, phone, zip_code, prefix, street, voivodeship) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2018-07-12 23:23:43,620 INFO [pl.edu.agh.paw.examples.IbanBean] (default task-3) zainicjowano obiekt UserActivation a pole activated jest :N
2018-07-12 23:23:43,621 INFO [pl.edu.agh.paw.examples.IbanBean] (default task-3) zainicjowano obiekt UserActivation a pole id jest :0
2018-07-12 23:23:43,621 INFO [StudentDatabaseBean] (default task-3) utw�rz wywo�anie dla: UserActivation{activation_id='0', activated='N'id='0'}
2018-07-12 23:23:43,627 INFO [stdout] (default task-3) Hibernate: insert into signatories_activation (activated, id) values (?, ?)
2018-07-12 23:23:43,633 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-3) SQL Error: 1452, SQLState: 23000
2018-07-12 23:23:43,633 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-3) Cannot add or update a child row: a foreign key constraint fails (`paw_news`.`signatories_activation`, CONSTRAINT `signatories_activation_ibfk_1` FOREIGN KEY (`id`) REFERENCES `signatories` (`id`) ON UPDATE CASCADE)
2018-07-12 23:23:43,638 ERROR [org.jboss.as.ejb3.invocation] (default task-3) WFLYEJB0034: EJB Invocation failed on component UserActivationDao for method public void paw.signup.dao.AbstractDao.create(java.lang.Object): javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:186)
Pozdrawiam,