Search code examples
javahibernatejpamany-to-many

How mapping @ManyToMany with primary key in extra table using java.util.List


If i do this;

public class Client{

    @Id
    @Column(columnDefinition = "CHAR(11)")
    private String cpf;

    @ManyToMany(cascade = CascadeType.ALL)
    private List<Address> addresses;
    //get set
}

.

public class Address{

    @Id
    private String zipCode;

    @Id
    private String number;

    @Id
    @Column(columnDefinition = "varchar(255) default 'DONT HAVE'")
    private String complement;
    //get set
}

... I have this mapping:

Image - Model using java.util.List with @ManyToMany

If i do this;

public class Client{

    @Id
    @Column(columnDefinition = "CHAR(11)")
    private String cpf;

    @ManyToMany(cascade = CascadeType.ALL)
    private Set<Address> addresses;
    //get set
}

.

public class Address{

    @Id
    private String zipCode;

    @Id
    private String number;

    @Id
    @Column(columnDefinition = "varchar(255) default 'DONT HAVE'")
    private String complement;
    //get set
}

... I have this mapping:

Image - Model using java.util.Set with @ManyToMany

The Question is: how do I get the attributes of the extra table automatically generated by @ManyToMany relationship are primary foreign keys(PFK) using java.util.List?


Solution

  • in my jpa study, we don't need create a primary key in extra table generate by @ManyToMany.

    This is my final solution:

    public class Client{
    
       @Id
       @Column(columnDefinition = "CHAR(11)")
       private String cpf;
    
       @ManyToMany(cascade = CascadeType.ALL)
       @JoinTable(name="client_address", joinColumns = {
         @JoinColumn(name = "client_cpf") },
         inverseJoinColumns = { @JoinColumn(name = "address_zipcode", 
           referencedColumnName="zipCode"), @JoinColumn(name = "address_number", 
             referencedColumnName="number", @JoinColumn(name = 
             "address_complement", 
             referencedColumnName="complement"},
         uniqueConstraints = @UniqueConstraint(columnNames = {
           "client_cpf", "address_zipcode", "address_number",  
           "address_complement" })
       private List<Address> addresses;
       //get set
    }