hibernate3学习笔记(十一)|复合主键

新建数据库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.}

少吃点,吃好的。

hibernate3学习笔记(十一)|复合主键

相关文章:

你感兴趣的文章:

标签云: