Mappatura di @ManyToMany tabella di associazione con colonne aggiuntive

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