Sziasztok.
Lenne egy entitás mely a vevő címek gépkocsikhoz rendelését hivatott reprezentálni.
Működik is szépen, ha már van létező (mentett) gépkocsi és ahhoz rendelek címeket.
De ha létrehozok egy új gépkocsi entitást(mely még nem volt perzisztálva), hozzáadok vevő címeket
entity.getVevocimek().add(cim);
(a vevő címek már léteznek az adatbázisban) akkor
Cannot add or update a child row: a foreign key constraint fails
hibaüzenetet kapok.
Azt gyanítom, hogy a JPA nem tudja (vagy én nem tudom hogy kell) megoldani, hogy először elmentse a szülő, majd a gyerek rekordokat.
CREATE TABLE VEVOCIM (
ID INTEGER NOT NULL,
IDMOD INTEGER NOT NULL,
CONSTRAINT PK_VEVOCIM PRIMARY KEY (ID, IDMOD)
)
CREATE TABLE GEPKOCSI (
ID INTEGER NOT NULL AUTO_INCREMENT,
CONSTRAINT PK_GEPKOCSI PRIMARY KEY (ID),
)
CREATE TABLE GEPKOCSI_VEVOCIM_OSSZERENDELO (
ID_GEPKOCSI INTEGER NOT NULL,
ID_VEVOCIM INTEGER NOT NULL,
ID_VEVOCIM_MOD INTEGER NOT NULL,
CONSTRAINT PK_GEPKOCSI_VEVOCIM_OSSZERENDELO PRIMARY KEY (ID_GEPKOCSI, ID_VEVOCIM, ID_VEVOCIM_MOD),
CONSTRAINT FK_GEPKOCSI_VEVOCIM_OSSZERENDELO_01 FOREIGN KEY (ID_GEPKOCSI) REFERENCES GEPKOCSI (ID),
CONSTRAINT FK_GEPKOCSI_VEVOCIM_OSSZERENDELO_02 FOREIGN KEY (ID_VEVOCIM, ID_VEVOCIM_MOD) REFERENCES VEVOCIM (ID,IDMOD)
);
@Entity
@IdClass(VevoPK.class)
public class Vevo {
@Id
@Column(name = "ID")
private int id;
@Id
@Column(name = "ID")
private int idmod;
....
}
@Entity
public class Gepkocsi {
@Id
@Column(name = "ID")
private int id;
@OneToMany
@JoinTable
(
name = "GEPKOCSI_VEVOCIM_OSSZERENDELO",
joinColumns = {@JoinColumn(name = "ID_GEPKOCSI", referencedColumnName = "ID")},
inverseJoinColumns = {@JoinColumn(name = "ID_VEVOCIM", referencedColumnName = "ID", unique = true),
@JoinColumn(name = "ID_VEVOCIM_MOD", referencedColumnName = "IDMOD", unique = true)}
)
private List<Vevocim> vevocimek;
Ha csak simán perzisztálok
public void save {
entityManager.getTransaction().begin();
entityManager.persist(getEntity());
entityManager.getTransaction().commit();
}
akkor ezt a hibaüzenetet kapom.
org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
Ha módosítom a Gepkocsi entitást
@OneToMany(cascade = CascadeType.ALL)
akkor az alábbi hibaüzenetet jön:
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1-1' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO VEVOCIM (ID, IDMOD, AJTO, AKTIV, CIMTIPUS, CK, CREATE_TIME, CREATE_USER, EMELET, EPULET, HAZSZAM, HELYRAJZISZAM, IDVEVO, IDVEVOMOD, IRANYITOSZAM, KERULET, KOZTERULET, KOZTERULETJELLEGE, LAT, LEPCSOHAZ, LNG, MOD_TIME, MOD_USER, NEV, ORSZAG, TELEPULESNEVE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
tehát a már létező vevőcímet akarja visszamenteni az adatbázisba.
Hogy kell ezt rendesen csinálni? A vevőcímek már léteznek, perzisztálva vannak.
Az új gépkocsi rögzítése közben szeretném hozzárendelni a vevő címeket és mentéskor történjen meg gépkocsi adatainak mentése a
GEPKOCSI
táblába és a
GEPKOCSI_VEVOCIM_OSSZERENDELO
táblába is insertálja be a megfelelő sort.