Hibernate 联合主键有三种写法 :
第一种:使用 @Embeddable注解
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;
}
}
创建表后:
查看创建表的语句:show create table testperson; 可以看到
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`)
)
第二种:使用 @EmbeddedId 注解
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;
}
}
创建结果和第一种一样
第三种:@IdClass(XXX.class)注解
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;
}
}
第三种结果和前两种一样;
注:使用联合主键要重写equals 和hashCode方法;