新建数据库User:
1.CREATE TABLE user (<br />2. name VARCHAR(100) NOT NULL,<br />3. phone VARCHAR(50) NOT NULL,<br />4. age INT,<br />5. PRIMARY KEY(name, phone)<br />6.);
现将name和phone定义成复合主键。分别使用2种方法如下:
方法1.复合主键字段直接包含在PO类中。
User.java(需要实现Serializable接口,并定义equals()和hashCode()方法)
1.package com.hb3.pack_03.model;<br />2.<br />3.import java.io.Serializable;<br />4.import org.apache.commons.lang.builder.EqualsBuilder;<br />5.import org.apache.commons.lang.builder.HashCodeBuilder;<br />6.7.public class User implements Serializable {<br />8.9. private static final long serialVersionUID = -8377583111386512407L;<br />10.11. private String name;<br />12. private String phone;<br />13. private Integer age;<br />14.<br />15. public User() {<br />16. }<br />17.18. public Integer getAge() {<br />19. return age;<br />20. }<br />21.22. public void setAge(Integer age) {<br />23. this.age = age;<br />24. }<br />25.26. public String getName() {<br />27. return name;<br />28. }<br />29.30. public void setName(String name) {<br />31. this.name = name;<br />32. }<br />33.34. public String getPhone() {<br />35. return phone;<br />36. }<br />37.38. public void setPhone(String phone) {<br />39. this.phone = phone;<br />40. }<br />41.<br />42. public boolean equals(Object obj) {<br />43. if(obj == this) {<br />44. return true;<br />45. }<br />46.<br />47. if(!(obj instanceof User)) {<br />48. return false;<br />49. }<br />50.<br />51. User user = (User) obj;<br />52. return new EqualsBuilder()<br />53. .append(this.name, user.getName())<br />54. .append(this.phone, user.getPhone())<br />55. .isEquals();<br />56. }<br />57.<br />58. public int hashCode() {<br />59. return new HashCodeBuilder()<br />60. .append(this.name)<br />61. .append(this.phone)<br />62. .toHashCode();<br />63. }<br />64.}
在定义equals和hashCode方法时使用了apache的common-lang包。
User.hbm.xml文件:
1.<?xml version="1.0" encoding="UTF-8"?><br />2.3.<!DOCTYPE hibernate-mapping PUBLIC<br />4. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />5. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">6.7.<hibernate-mapping><br />8.9. <class name="com.hb3.pack_03.model.User" table="user">10.<br />11. <composite-id>12.<br />13. <key-property name="name"<br />14. column="name"<br />15. type="java.lang.String"/>16. <key-property name="phone"<br />17. column="phone"<br />18. type="java.lang.String"/>19. </composite-id>20.21. <property name="age" column="age" type="java.lang.Integer"/>22.<br />23. </class><br />24.<br />25.</hibernate-mapping>
hibernate.cfg.xml中修改:
............
测试代码如下:
1.package com.hb3.pack_03;<br />2.<br />3.import org.hibernate.Session;<br />4.import org.hibernate.SessionFactory;<br />5.import org.hibernate.Transaction;<br />6.import org.hibernate.cfg.Configuration;<br />7.8.import com.hb3.pack_03.model.User;<br />9.10.public class BusinessService {<br />11.12. public static void main(String[] args) {<br />13.<br />14. Configuration config = new Configuration().configure();<br />15. SessionFactory sessionFactory = config.buildSessionFactory();<br />16. Session session = sessionFactory.openSession();<br />17.18. User user = new User();<br />19. user.setName("shenbin");<br />20. user.setPhone("0970123456");<br />21. user.setAge(28);<br />22. Transaction tx = session.beginTransaction();<br />23. session.save(user);<br />24. tx.commit();<br />25.<br />26. user = (User) session.load(User.class, user);<br />27.<br />28. System.out.println(user.getAge() + "/t" + user.getName() + "/t" + user.getPhone());<br />29.30. session.close();<br />31. sessionFactory.close();<br />32. }<br />33.}
请注意:在实际测试过程中,如果数据库已经有数据存在,则不需要上面的黑题部分向数据库追加数据。
另外还请留意的是,光有session.save(user);而没有tx.commit();的话,数据不会被持久到数据库中的。
方法2.复合主键字段独立到另一个类中。
UserPK.java(需要实现Serializable接口,并定义equals()和hashCode()方法)
1.package com.hb3.pack_04.model;<br />2.<br />3.import java.io.Serializable;<br />4.5.import org.apache.commons.lang.builder.EqualsBuilder;<br />6.import org.apache.commons.lang.builder.HashCodeBuilder;<br />7.8.public class UserPK implements Serializable {<br />9.10. private static final long serialVersionUID = -2457999265373664790L;<br />11.12. private String name;<br />13. private String phone;<br />14.15. public String getName() {<br />16. return name;<br />17. }<br />18. public void setName(String name) {<br />19. this.name = name;<br />20. }<br />21. public String getPhone() {<br />22. return phone;<br />23. }<br />24. public void setPhone(String phone) {<br />25. this.phone = phone;<br />26. }<br />27. public boolean equals(Object obj) {<br />28. if(obj == this) {<br />29. return true;<br />30. }<br />31.<br />32. if(!(obj instanceof User)) {<br />33. return false;<br />34. }<br />35.<br />36. UserPK pk = (UserPK) obj;<br />37. return new EqualsBuilder()<br />38. .append(this.name, pk.getName())<br />39. .append(this.phone, pk.getPhone())<br />40. .isEquals();<br />41. }<br />42.<br />43. public int hashCode() {<br />44. return new HashCodeBuilder()<br />45. .append(this.name)<br />46. .append(this.phone)<br />47. .toHashCode();<br />48. }<br />49.}
User.java
1.package com.hb3.pack_04.model;<br />2.<br />3.import java.io.Serializable;<br />4.5.public class User implements Serializable {<br />6.7. private static final long serialVersionUID = -8630481462628539996L;<br />8.9. private UserPK userPK;<br />10. private Integer age;<br />11.<br />12. public User() {<br />13. }<br />14.15. public UserPK getUserPK() {<br />16. return userPK;<br />17. }<br />18. public void setUserPK(UserPK userPK) {<br />19. this.userPK = userPK;<br />20. }<br />21. public Integer getAge() {<br />22. return age;<br />23. }<br />24. public void setAge(Integer age) {<br />25. this.age = age;<br />26. }<br />27.}
User.hbm.xml文件:
1.<?xml version="1.0" encoding="UTF-8"?><br />2.3.<!DOCTYPE hibernate-mapping PUBLIC<br />4. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />5. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">6.7.<hibernate-mapping><br />8.9. <class name="com.hb3.pack_04.model.User" table="user">10.<br />11. <composite-id name="userPK"12. class="com.hb3.pack_04.model.UserPK"13. unsaved-value="any">14. <key-property name="name"<br />15. column="name"<br />16. type="java.lang.String"/>17. <key-property name="phone"<br />18. column="phone"<br />19. type="java.lang.String"/>20. </composite-id>21.<br />22. <property name="age" column="age" type="java.lang.Integer"/>23.<br />24. </class><br />25.26.</hibernate-mapping>
hibernate.cfg.xml中修改:
............
测试代码如下:
1.package com.hb3.pack_04;<br />2.<br />3.import org.hibernate.Session;<br />4.import org.hibernate.SessionFactory;<br />5.import org.hibernate.cfg.Configuration;<br />6.7.import com.hb3.pack_04.model.User;<br />8.import com.hb3.pack_04.model.UserPK;<br />9.10.public class BusinessService {<br />11.12. public static void main(String[] args) {<br />13.<br />14. Configuration config = new Configuration().configure();<br />15. SessionFactory sessionFactory = config.buildSessionFactory();<br />16. Session session = sessionFactory.openSession();<br />17.18. UserPK pk = new UserPK();<br />19. pk.setName("shenbin");<br />20. pk.setPhone("0970123456");<br />21.<br />22. User user = (User) session.load(User.class, pk);<br />23.<br />24. System.out.println(user.getAge() +<br />25. "/t" + user.getUserPK().getName() +<br />26. "/t" + user.getUserPK().getPhone());<br />27.28. session.close();<br />29. sessionFactory.close();<br />30. }<br />31.}
少吃点,吃好的。