新建数据库User:

  1. CREATE TABLE user (
  2.     name VARCHAR(100) NOT NULL,
  3.     phone VARCHAR(50) NOT NULL,
  4.     age INT,
  5.     PRIMARY KEY(name, phone)
  6. );

现将name和phone定义成复合主键。分别使用2种方法如下:

方法1.复合主键字段直接包含在PO类中。

User.java(需要实现Serializable接口,并定义equals()和hashCode()方法

  1. package com.hb3.pack_03.model;

  2. import java.io.Serializable;
  3. import org.apache.commons.lang.builder.EqualsBuilder;
  4. import org.apache.commons.lang.builder.HashCodeBuilder;

  5. public class User implements Serializable {

  6.     private static final long serialVersionUID = -8377583111386512407L;

  7.     private String name;
  8.     private String phone;
  9.     private Integer age;
  10.     
  11.     public User() {
  12.     }

  13.     public Integer getAge() {
  14.         return age;
  15.     }

  16.     public void setAge(Integer age) {
  17.         this.age = age;
  18.     }

  19.     public String getName() {
  20.         return name;
  21.     }

  22.     public void setName(String name) {
  23.         this.name = name;
  24.     }

  25.     public String getPhone() {
  26.         return phone;
  27.     }

  28.     public void setPhone(String phone) {
  29.         this.phone = phone;
  30.     }
  31.     
  32.     public boolean equals(Object obj) {
  33.         if(obj == this) {
  34.             return true;
  35.         }
  36.         
  37.         if(!(obj instanceof User)) {
  38.             return false;
  39.         }
  40.         
  41.         User user = (User) obj;
  42.         return new EqualsBuilder()
  43.                  .append(this.name, user.getName())
  44.                  .append(this.phone, user.getPhone())
  45.                  .isEquals();
  46.     }
  47.     
  48.     public int hashCode() {
  49.         return new HashCodeBuilder()
  50.                  .append(this.name)
  51.                  .append(this.phone)
  52.                  .toHashCode();
  53.     }
  54. }

在定义equals和hashCode方法时使用了apache的common-lang包。

User.hbm.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping> 

  6.     <class name="com.hb3.pack_03.model.User" table="user">
  7.     
  8.         <composite-id>
  9.         
  10.             <key-property name="name" 
  11.                           column="name" 
  12.                           type="java.lang.String"/>
  13.             <key-property name="phone" 
  14.                           column="phone" 
  15.                           type="java.lang.String"/>
  16.         </composite-id>

  17.         <property name="age" column="age" type="java.lang.Integer"/>
  18.     
  19.     </class> 
  20.     
  21. </hibernate-mapping>

hibernate.cfg.xml中修改:

......

<mapping resource="com/hb3/pack_03/model/User.hbm.xml" />

......

 

测试代码如下:

  1. package com.hb3.pack_03;

  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.Transaction;
  5. import org.hibernate.cfg.Configuration;

  6. import com.hb3.pack_03.model.User;

  7. public class BusinessService {

  8.     public static void main(String[] args) {
  9.         
  10.         Configuration config = new Configuration().configure();
  11.         SessionFactory sessionFactory = config.buildSessionFactory();      
  12.         Session session = sessionFactory.openSession();

  13.         User user = new User();
  14.         user.setName("shenbin");
  15.         user.setPhone("0970123456");
  16.         user.setAge(28);
  17.         Transaction tx = session.beginTransaction();
  18.         session.save(user);
  19.         tx.commit();
  20.         
  21.         user = (User) session.load(User.class, user);
  22.                 
  23.         System.out.println(user.getAge() + "\t" +  user.getName() + "\t" + user.getPhone());

  24.         session.close();
  25.         sessionFactory.close();
  26.     }
  27. }

请注意:在实际测试过程中,如果数据库已经有数据存在,则不需要上面的黑题部分向数据库追加数据。

另外还请留意的是,光有session.save(user);而没有tx.commit();的话,数据不会被持久到数据库中的。

 

方法2.复合主键字段独立到另一个类中。

UserPK.java(需要实现Serializable接口,并定义equals()和hashCode()方法)

  1. package com.hb3.pack_04.model;

  2. import java.io.Serializable;

  3. import org.apache.commons.lang.builder.EqualsBuilder;
  4. import org.apache.commons.lang.builder.HashCodeBuilder;

  5. public class UserPK implements Serializable {

  6.     private static final long serialVersionUID = -2457999265373664790L;

  7.     private String name;
  8.     private String phone;

  9.     public String getName() {
  10.         return name;
  11.     }
  12.     public void setName(String name) {
  13.         this.name = name;
  14.     }
  15.     public String getPhone() {
  16.         return phone;
  17.     }
  18.     public void setPhone(String phone) {
  19.         this.phone = phone;
  20.     }
  21.     public boolean equals(Object obj) {
  22.         if(obj == this) {
  23.             return true;
  24.         }
  25.         
  26.         if(!(obj instanceof User)) {
  27.             return false;
  28.         }
  29.         
  30.         UserPK pk = (UserPK) obj;
  31.         return new EqualsBuilder()
  32.                  .append(this.name, pk.getName())
  33.                  .append(this.phone, pk.getPhone())
  34.                  .isEquals();
  35.     }
  36.     
  37.     public int hashCode() {
  38.         return new HashCodeBuilder()
  39.                  .append(this.name)
  40.                  .append(this.phone)
  41.                  .toHashCode();
  42.     }
  43. }

User.java

  1. package com.hb3.pack_04.model;

  2. import java.io.Serializable;

  3. public class User implements Serializable {

  4.     private static final long serialVersionUID = -8630481462628539996L;

  5.     private UserPK userPK;
  6.     private Integer age;
  7.     
  8.     public User() {
  9.     }

  10.     public UserPK getUserPK() {
  11.         return userPK;
  12.     }
  13.     public void setUserPK(UserPK userPK) {
  14.         this.userPK = userPK;
  15.     }
  16.     public Integer getAge() {
  17.         return age;
  18.     }
  19.     public void setAge(Integer age) {
  20.         this.age = age;
  21.     }
  22. }

User.hbm.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping> 

  6.     <class name="com.hb3.pack_04.model.User" table="user">
  7.     
  8.         <composite-id name="userPK"
  9.                       class="com.hb3.pack_04.model.UserPK"
  10.                       unsaved-value="any">
  11.             <key-property name="name" 
  12.                           column="name" 
  13.                           type="java.lang.String"/>
  14.             <key-property name="phone" 
  15.                           column="phone" 
  16.                           type="java.lang.String"/>
  17.         </composite-id>
  18.         
  19.         <property name="age" column="age" type="java.lang.Integer"/>
  20.     
  21.     </class> 

  22. </hibernate-mapping>

hibernate.cfg.xml中修改:

......

<mapping resource="com/hb3/pack_04/model/User.hbm.xml" />

......

 

测试代码如下:

  1. package com.hb3.pack_04;

  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;

  5. import com.hb3.pack_04.model.User;
  6. import com.hb3.pack_04.model.UserPK;

  7. public class BusinessService {

  8.     public static void main(String[] args) {
  9.         
  10.         Configuration config = new Configuration().configure();
  11.         SessionFactory sessionFactory = config.buildSessionFactory();      
  12.         Session session = sessionFactory.openSession();

  13.         UserPK pk = new UserPK();
  14.         pk.setName("shenbin");
  15.         pk.setPhone("0970123456");
  16.                
  17.         User user = (User) session.load(User.class, pk);
  18.                
  19.         System.out.println(user.getAge() + 
  20.                     "\t" + user.getUserPK().getName() + 
  21.                     "\t" + user.getUserPK().getPhone());

  22.         session.close();
  23.         sessionFactory.close();
  24.     }
  25. }


ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程