There are three ways to write a Hibernate union primary key:
The first: use the @Embeddable annotation
import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class TestPerson implements Serializable{ private static final long serialVersionUID = 1L; private String password; private String email; private String adress; @Id private TestPersonPk testPersonPk; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public TestPersonPk getTestPersonPk () { return testPersonPk; } public void setTestPersonPk (TestPersonPk testPersonPk) { this.testPersonPk = testPersonPk; } }
import java.io.Serializable; import javax.persistence.Embeddable; @Embeddable public class TestPersonPk implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof TestPersonPk){ TestPersonPk testPersonPk = (TestPersonPk) obj; if(testPersonPk.getId().equals(this.getId()) && testPersonPk.getName().equals(this.getName())){ return true; } } return false; } }
After creating the table:
View the statement to create the table: show create table testperson; you can see
CREATE TABLE `testperson` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`adress` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`,`name`)
)
The second: use @EmbeddedId annotation
import java.io.Serializable; import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public class TestPerson implements Serializable{ private static final long serialVersionUID = 1L; private String password; private String email; private String adress; @EmbeddedId private TestPersonPk testPersonPk; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public TestPersonPk getTestPersonPk () { return testPersonPk; } public void setTestPersonPk (TestPersonPk testPersonPk) { this.testPersonPk = testPersonPk; } }
import java.io.Serializable; public class TestPersonPk implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof TestPersonPk){ TestPersonPk testPersonPk = (TestPersonPk) obj; if(testPersonPk.getId().equals(this.getId()) && testPersonPk.getName().equals(this.getName())){ return true; } } return false; } }
The result is the same as the first
The third type: @IdClass(XXX.class) annotation
import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; @Entity @IdClass (TestPersonPk.class) public class TestPerson implements Serializable{ private static final long serialVersionUID = 1L; private String password; private String email; private String adress; private Integer id; private String name; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Id public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } }
import java.io.Serializable; public class TestPersonPk implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof TestPersonPk){ TestPersonPk testPersonPk = (TestPersonPk) obj; if(testPersonPk.getId().equals(this.getId()) && testPersonPk.getName().equals(this.getName())){ return true; } } return false; } }
The third result is the same as the first two;
Note: The equals and hashCode methods need to be rewritten to use the joint primary key;