Il mio database contiene 3 tabelle: person
, document
e peson_document
. Persona e documento hanno una relazione molti-a-molti e sono uniti alla tabella person_document
che contiene le colonne di aggiunta. Questa è la mia mapping:
class Person { @Cascade(CascadeType.ALL) @OneToMany(mappedBy = "compositePK.person", orphanRemoval = true) Set personDocuments; } class Document { @OneToMany(mappedBy = "compositePK.document") Set personDocuments; } class PersonDocument { @EmbeddedId private CompositePK compositePK; @Column(name = "person_origin_id") private String personID; @ManyToOne(fetch = FetchType.LAZY) private Provider provider; @Embeddable public static class CompositePK implements Serializable { @ManyToOne(fetch = FetchType.LAZY) private Person person; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "documents_guid") private Document document; }
Nel mio codice sto provando a salvare quadro come questa:
Set pds = new HashSet(); Document doc = new Document(); //set doc, set person to new PersonDocument and add once on pds set. person.getPersonDocuments().addAll(pds); personRepository.save(person);
Il problema è che l’ibernazione non lo salva e genera un’eccezione: l’ insert or update on table violates foreign key constraint
– perché nella tabella del document
non c’è alcun record. Quindi, perché hibernate non persistere il document
prima di salvare person_document
e come risolvere questo problema?
Prova questo:
public class Person { @OneToMany(mappedBy = "person", orphanRemoval = true, cascade= CascadeType.ALL) Set personDocuments; }
class Document { @OneToMany(mappedBy = "document") Set personDocuments; }
public class PersonDocument { @EmbeddedId private CompositePK compositePK; @MapsId("person") @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "person_origin_id") private Person person; @MapsId("document") @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "documents_guid") private Document document; @ManyToOne(fetch = FetchType.LAZY) private Provider provider; }
@Embeddable public class CompositePK implements Serializable { //these fields should have the same type as the ID field of the corresponding entities //assuming Long but you have ommitted the ID fields private Long person; private Long document; //implement equals() and hashcode() as per the JPA spec }
//you must always set both side of the relationship Person person = new Person(); Document document = new Document(); PersonDocument pd = new PersonDocument(); pd.setPerson(person); pd.setDocument(document); person.getPersonDocuments.add(pd);//assumes initialized