新建數(shù)據(jù)庫(kù)User:
- CREATE TABLE user (
- name VARCHAR(100) NOT NULL,
- phone VARCHAR(50) NOT NULL,
- age INT,
- PRIMARY KEY(name, phone)
- );
現(xiàn)將name和phone定義成復(fù)合主鍵。分別使用2種方法如下:
方法1.復(fù)合主鍵字段直接包含在PO類中。
User.java(需要實(shí)現(xiàn)Serializable接口,并定義equals()和hashCode()方法)
- package com.hb3.pack_03.model;
- import java.io.Serializable;
- import org.apache.commons.lang.builder.EqualsBuilder;
- import org.apache.commons.lang.builder.HashCodeBuilder;
- public class User implements Serializable {
- private static final long serialVersionUID = -8377583111386512407L;
- private String name;
- private String phone;
- private Integer age;
-
- public User() {
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPhone() {
- return phone;
- }
- public void setPhone(String phone) {
- this.phone = phone;
- }
-
- public boolean equals(Object obj) {
- if(obj == this) {
- return true;
- }
-
- if(!(obj instanceof User)) {
- return false;
- }
-
- User user = (User) obj;
- return new EqualsBuilder()
- .append(this.name, user.getName())
- .append(this.phone, user.getPhone())
- .isEquals();
- }
-
- public int hashCode() {
- return new HashCodeBuilder()
- .append(this.name)
- .append(this.phone)
- .toHashCode();
- }
- }
在定義equals和hashCode方法時(shí)使用了apache的common-lang包。
User.hbm.xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.hb3.pack_03.model.User" table="user">
-
- <composite-id>
-
- <key-property name="name"
- column="name"
- type="java.lang.String"/>
- <key-property name="phone"
- column="phone"
- type="java.lang.String"/>
- </composite-id>
- <property name="age" column="age" type="java.lang.Integer"/>
-
- </class>
-
- </hibernate-mapping>
hibernate.cfg.xml中修改:
......
<mapping resource="com/hb3/pack_03/model/User.hbm.xml" />
......
測(cè)試代碼如下:
- package com.hb3.pack_03;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import com.hb3.pack_03.model.User;
- public class BusinessService {
- public static void main(String[] args) {
-
- Configuration config = new Configuration().configure();
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.openSession();
- User user = new User();
- user.setName("shenbin");
- user.setPhone("0970123456");
- user.setAge(28);
- Transaction tx = session.beginTransaction();
- session.save(user);
- tx.commit();
-
- user = (User) session.load(User.class, user);
-
- System.out.println(user.getAge() + "\t" + user.getName() + "\t" + user.getPhone());
- session.close();
- sessionFactory.close();
- }
- }
請(qǐng)注意:在實(shí)際測(cè)試過(guò)程中,如果數(shù)據(jù)庫(kù)已經(jīng)有數(shù)據(jù)存在,則不需要上面的黑題部分向數(shù)據(jù)庫(kù)追加數(shù)據(jù)。
另外還請(qǐng)留意的是,光有session.save(user);而沒(méi)有tx.commit();的話,數(shù)據(jù)不會(huì)被持久到數(shù)據(jù)庫(kù)中的。
方法2.復(fù)合主鍵字段獨(dú)立到另一個(gè)類中。
UserPK.java(需要實(shí)現(xiàn)Serializable接口,并定義equals()和hashCode()方法)
- package com.hb3.pack_04.model;
- import java.io.Serializable;
- import org.apache.commons.lang.builder.EqualsBuilder;
- import org.apache.commons.lang.builder.HashCodeBuilder;
- public class UserPK implements Serializable {
- private static final long serialVersionUID = -2457999265373664790L;
- private String name;
- private String phone;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPhone() {
- return phone;
- }
- public void setPhone(String phone) {
- this.phone = phone;
- }
- public boolean equals(Object obj) {
- if(obj == this) {
- return true;
- }
-
- if(!(obj instanceof User)) {
- return false;
- }
-
- UserPK pk = (UserPK) obj;
- return new EqualsBuilder()
- .append(this.name, pk.getName())
- .append(this.phone, pk.getPhone())
- .isEquals();
- }
-
- public int hashCode() {
- return new HashCodeBuilder()
- .append(this.name)
- .append(this.phone)
- .toHashCode();
- }
- }
User.java
- package com.hb3.pack_04.model;
- import java.io.Serializable;
- public class User implements Serializable {
- private static final long serialVersionUID = -8630481462628539996L;
- private UserPK userPK;
- private Integer age;
-
- public User() {
- }
- public UserPK getUserPK() {
- return userPK;
- }
- public void setUserPK(UserPK userPK) {
- this.userPK = userPK;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- }
User.hbm.xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.hb3.pack_04.model.User" table="user">
-
- <composite-id name="userPK"
- class="com.hb3.pack_04.model.UserPK"
- unsaved-value="any">
- <key-property name="name"
- column="name"
- type="java.lang.String"/>
- <key-property name="phone"
- column="phone"
- type="java.lang.String"/>
- </composite-id>
-
- <property name="age" column="age" type="java.lang.Integer"/>
-
- </class>
- </hibernate-mapping>
hibernate.cfg.xml中修改:
......
<mapping resource="com/hb3/pack_04/model/User.hbm.xml" />
......
測(cè)試代碼如下:
- package com.hb3.pack_04;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- import com.hb3.pack_04.model.User;
- import com.hb3.pack_04.model.UserPK;
- public class BusinessService {
- public static void main(String[] args) {
-
- Configuration config = new Configuration().configure();
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.openSession();
- UserPK pk = new UserPK();
- pk.setName("shenbin");
- pk.setPhone("0970123456");
-
- User user = (User) session.load(User.class, pk);
-
- System.out.println(user.getAge() +
- "\t" + user.getUserPK().getName() +
- "\t" + user.getUserPK().getPhone());
- session.close();
- sessionFactory.close();
- }
- }
ExtJS教程-
Hibernate教程-
Struts2 教程-
Lucene教程