∪∩deniable Design

个人JAVA版GAE(google app engine),struts2+jpa+jQuery开发,互相交流 http://iunbug.appspot.com/
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Hibernate学习笔记( 三)-- 复合主键

Posted on 2008-09-01 16:43 ∪∩BUG 阅读(894) 评论(1)  编辑  收藏 所属分类: Hibernate学习笔记

关于如何配置请参看:Hibernate学习笔记(一)--用MyEclipse 6.5+MySQL 5.0的环境跑起来
准备:建表

用MySQL在名为STMS数据库中建表personx

 

src/org.lxh.hibernate2.Personx.java

 1package org.lxh.hibernate2;
 2
 3/**
 4 * @author ∪∩BUG E-mail: tidelgl@163.com
 5 * @version Aug 31, 2008 9:56:51 AM @ POJO类
 6 */

 7
 8//实现复合主键应满足的要求:1.本类必须实现Serializable 接口
 9public class Personx implements java.io.Serializable {
10
11    private PersonxId id;
12    private int age;
13
14    public Personx() {
15    }

16
17    public PersonxId getId() {
18        return this.id;
19    }

20
21    public void setId(PersonxId id) {
22        this.id = id;
23    }

24
25    public int getAge() {
26        return age;
27    }

28
29    public void setAge(int age) {
30        this.age = age;
31    }

32}


通过Hibernate反向工程建立personx表与Personx类的映射

首先调出DB Browser视图(Windows—view show—other—MyEclipse datebase—DB Browser)—展开MySQL_localhost至表person—右键表personx—Hibernate Reverse Engineering

 
src/org.lxh.hibernate2.PersonxId.java

 1package org.lxh.hibernate2;
 2
 3import org.apache.commons.lang.builder.EqualsBuilder;
 4import org.apache.commons.lang.builder.HashCodeBuilder;
 5import org.lxh.hibernate1.Personx;
 6
 7/**
 8 * @author ∪∩BUG E-mail: tidelgl@163.com
 9 * @version Aug 31, 2008 9:56:51 AM @ 复合主键类
10 */

11//实现复合主键应满足的要求:
12//1.本类必须实现Serializable 接口
13//2.复写equals(比较对象)和hashCode(取得Hash编码)方法(可用commons-lang-2.4.jar来复写,
14//下载:http://apache.mirror.phpchina.com/commons/lang/binaries/commons-lang-2.4-bin.zip)
15public class PersonxId implements java.io.Serializable {
16
17    // Fields
18
19    private String name;
20    private String phone;
21
22    // Constructors
23
24    /** default constructor */
25    public PersonxId() {
26    }

27
28    /** full constructor */
29    public PersonxId(String name, String phone) {
30        this.name = name;
31        this.phone = phone;
32    }

33
34    // Property accessors
35
36    public String getName() {
37        return this.name;
38    }

39
40    public void setName(String name) {
41        this.name = name;
42    }

43
44    public String getPhone() {
45        return this.phone;
46    }

47
48    public void setPhone(String phone) {
49        this.phone = phone;
50    }

51
52    // 修改复写equals的方法
53    public boolean equals(Object obj) {
54        if (this == obj) {
55            return true;
56        }

57
58        // 如果不是Personx的实例
59        if (!(obj instanceof Personx)) {
60            return false;
61        }

62        PersonxId p = (PersonxId) obj;
63        return new EqualsBuilder().append(this.name, p.getName()).append(
64                this.phone, p.getPhone()).isEquals();
65    }

66
67    //修改复写hashCode的方法
68    public int hashCode() {
69        return new HashCodeBuilder().append(this.name).append(
70                this.phone).toHashCode();
71    }

72
73}


src/org.lxh.hibernate2.PersonxOperate.java

 1package org.lxh.hibernate2;
 2
 3
 4import org.hibernate.Session;
 5import org.hibernate.cfg.Configuration;
 6
 7/**
 8 * @author ∪∩BUG E-mail: tidelgl@163.com
 9 * @version Aug 31, 2008 9:56:51 AM 
10 * @ 具体操作Hibernate的类
11 */

12public class PersonxOperate {
13    // 在Hibernate中所有的操作都是通过Session来完成
14    private Session session;
15
16    // Session 是一个接口,必须实例化
17    // 在构造方法中实例实化Session对象
18    public PersonxOperate() {
19        // 找到Hibernae配置文件,从全局文件中取出SessionFactory,从sessionFactory中取出一个session
20        this.session = new Configuration().configure().buildSessionFactory()
21                .openSession();
22    }

23
24    // 所有的操作都是通过Session进行
25    // (1)增加操作
26    public void insert(Personx p) {
27        // 将数据存放到数据库中
28        this.session.save(p);
29
30        // 事务提交
31        this.session.beginTransaction().commit();
32    }

33}

34


src/org.lxh.hibernate2.Test.java

 1package org.lxh.hibernate2;
 2
 3
 4
 5/** 
 6 * @author ∪∩BUG E-mail: tidelgl@163.com
 7 * @version Aug 31, 2008 9:54:16 AM 
 8 * @测试类
 9 */

10public class Test {
11
12    /**
13     * @param args
14     */

15    public static void main(String[] args) {
16        Personx p = new Personx();
17        PersonxId pk = new PersonxId();
18        
19        //name,phone在表中是主键当插入值为空时将无法插入
20//        p.setAge(4);
21//        p.setName("Hibernate");
22//        p.setPhone("123456");
23        
24        p.setAge(2);
25        pk.setName("MySQL");
26        pk.setPhone("87654");
27        p.setId(pk);
28        PersonxOperate po = new PersonxOperate();
29        po.insert(p);
30    }

31
32}

33


src/org.lxh.hibernate2.Personx.hbm.xml

 1xml version="1.0" encoding="utf-8"?>
 2DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4
 7<hibernate-mapping>
 8    <class name="org.lxh.hibernate2.Personx" table="personx"
 9        catalog="stms">
10        
14        <composite-id name="id" class="org.lxh.hibernate2.PersonxId">
15            <key-property name="name" type="java.lang.String">
16                <column name="name" length="100" />
17            key-property>
18            <key-property name="phone" type="java.lang.String">
19                <column name="phone" length="50" />
20            key-property>
21        composite-id>
22        <property name="age" type="java.lang.Integer">
23            <column name="age" />
24        property>
25    class>
26hibernate-mapping>
27


src/hibernate.cfg.xml

 1xml version='1.0' encoding='UTF-8'?>
 2DOCTYPE hibernate-configuration PUBLIC
 3          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5
 6
 7<hibernate-configuration>
 8
 9<session-factory>
10    <property name="connection.username">rootproperty>
11    <property name="connection.url">
12        jdbc:mysql://localhost:3306/STMS
13    property>
14    <property name="dialect">
15        org.hibernate.dialect.MySQLDialect
16    property>
17    <property name="myeclipse.connection.profile">
18        MySql_localhost
19    property>
20    <property name="connection.password">rootproperty>
21    <property name="connection.driver_class">
22        com.mysql.jdbc.Driver
23    property>
24    <property name="show_sql">trueproperty>
25
26    
27    <mapping resource="org/lxh/hibernate2/Personx.hbm.xml" />
28
29session-factory>
30
31hibernate-configuration>


 

例子结构:


评论

# re: Hibernate学习笔记( 三)-- 复合主键  回复  更多评论   

2008-09-01 17:33 by ∪∩BUG
开始建映射时一直没有选择JAVA DATA OBJECT使得没有得到PersonxId.java,这里我顺便把图给上了.

只有注册用户登录后才能发表评论。


网站导航: