实现复合主键的方法比较多,我通常采用以下方式。(固然了,能不使用复合主键就不使用) java
Student类中,经过@EmbeddedId来指定主键是复合主键。 app
UserName类同时须要@Embeddable来标注。 socket
Student类中不单单包含了复合主键,也包含了其余类型的属性,例如@Lob(经过使用Oracle10gR2来测试,并无出现“no more data read from socket"的错误。) ide
复杂属性,也能够经过@Embeddable来进行标注。 测试
@Entity @Table(name="tmp_student") public class Student implements Serializable { @EmbeddedId private UserName username; private Address address; public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public UserName getUsername() { return username; } public void setUsername(UserName username) { this.username = username; } @Lob private byte []images; @Lob private String text; public byte[] getImages() { return images; } public void setImages(byte[] images) { this.images = images; } public String getText() { return text; } public void setText(String text) { this.text = text; } @Embeddable public static class Address implements Serializable{ private String homeAddress; private String officeAddress; public String getHomeAddress() { return homeAddress; } public void setHomeAddress(String homeAddress) { this.homeAddress = homeAddress; } public String getOfficeAddress() { return officeAddress; } public void setOfficeAddress(String officeAddress) { this.officeAddress = officeAddress; } } @Embeddable public static class UserName implements Serializable{ /** * */ private static final long serialVersionUID = -6684160391794613605L; private String first_name; private String last_name; public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } @Override public boolean equals(Object object){ if(object instanceof UserName){ UserName userName=(UserName) object; return new EqualsBuilder().append(this.first_name, userName.getFirst_name()) .append(this.last_name, userName.getLast_name()) .isEquals(); } else{ return false; } } @Override public int hashCode(){ //取任意素数17 int result=17; result = 31*result +first_name.hashCode(); result = 31*result +last_name.hashCode(); return result; } } }