實現複合主鍵的方法比較多,我通常採用以下方式。(固然了,能不使用複合主鍵就不使用) 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; } } }