@Entity public class PersonAddress implements Serializable { @Id @ManyToOne private Person person; @Id @ManyToOne() private Address address; public PersonAddress() {} public PersonAddress(Person person, Address address) { this.person = person; this.address = address; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PersonAddress that = (PersonAddress) o; return Objects.equals(person, that.person) && Objects.equals(address, that.address); } @Override public int hashCode() { return Objects.hash(person, address); } } @Entity public class Person { @Id @GeneratedValue private Long id; @NaturalId private String registrationNumber; public Person() {} public Person(String registrationNumber) { this.registrationNumber = registrationNumber; } public Long getId() { return id; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(registrationNumber, person.registrationNumber); } @Override public int hashCode() { return Objects.hash(registrationNumber); } } @Entity public class Address { @Id @GeneratedValue private Long id; private String street; private String number; private String postalCode; public Address() {} public Address(String street, String number, String postalCode) { this.street = street; this.number = number; this.postalCode = postalCode; } public Long getId() { return id; } public String getStreet() { return street; } public String getNumber() { return number; } public String getPostalCode() { return postalCode; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Address address = (Address) o; return Objects.equals(street, address.street) && Objects.equals(number, address.number) && Objects.equals(postalCode, address.postalCode); } @Override public int hashCode() { return Objects.hash(street, number, postalCode); } }