Hibernate以组件作为复合主键实例详解

有时候我的表中需要多个主键的时候,这个时候我们就需要使用组件来做为表的主键。

1.我们需要一份hibernate.cfg.xml的配置文件
2.我们需要一个用来持久化的类,我这里例子用的是 Member.java
3.需要一个组件类, 我这里的例子用的是 Name.java
4.需要为持久化类配置一个映射的规则文件。 Member.cfg.xml
5.用来将持久化类插入数据库的操纵类, 我这里的例子用的是 MemberHandler.java

1.hibernate.cfg.xml

 代码如下 复制代码

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <!-- 配置数据库方言 -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- 配置数据库的驱动 -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 配置数据库用户名 -->
    <property name="hibernate.connection.username">root</property>
    <!-- 配置数据库的密码 -->
    <property name="hibernate.connection.password">root</property>
    <!-- 配置数据库的url -->
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    <!-- 配置数据池的最大容量 -->
    <property name="hibernate.c3p0.max_size">20</property>
    <!-- 配置数据池的最小容量 -->
    <property name="hibernate.c3p0.min_size">1</property>
    <!-- 配置数据链接的超时界限 -->
    <property name="hibernate.c3p0.timeout">5000</property>
    <!-- 在控制台显示后台是否打印执行的sql -->
    <property name="hibernate.show_sql">true</property>
    <!-- 是否以友好的格式显示打印的sql -->
    <property name="hibernate.format_sql">true</property>
    <!-- 打印一些辅助性的注释 -->
    <property name="hibernate.use_sql_comments">true</property>

    <property name="hibernate.c3p0.max_statements">100</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.c3p0.acquire_increment">2</property>
    <property name="hibernate.c3p0.validate">true</property>
    <!-- 配置数据操作的方式 -->
    <property name="hbm2ddl.auto">create</property>
    <!-- 将我们上面 Member 的映射文件添加进来 -->
    <mapping resource="org/Rudiment/hibernate/Member.hbm.xml" />
</session-factory>
</hibernate-configuration>

2.持久化类 Member.java

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.util.HashMap;
import java.util.Map;

public class Member {
    private Integer id;
    private Name name;
    private Integer age;
 
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Name getName() {
        return name;
    }
    public void setName(Name name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

3.持久化类的组件类 Name.java,这个类需要实现 Serializable 这个接口,保证能序列化,还有重写equals和hashCode这两个方法

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.io.Serializable;

public class Name implements Serializable
{
    private String first;
    private String last;
   
    public Name()
    {}
   
    public Name(String first, String last)
    {
        this.first = first;
        this.last = last;
    }
   
    public String getFirst() {
        return first;
    }
    public void setFirst(String first) {
        this.first = first;
    }
    public String getLast() {
        return last;
    }
    public void setLast(String last) {
        this.last = last;
    }
   
    @Override
    public boolean equals(Object obj)
    {
        if(this == obj)
        {
            return true;
        }
        else if(obj != null && obj.getClass() == Name.class)
        {
            Name target = (Name)obj;
            if(target.getFirst().equals(this.getFirst()) && target.getLast().equals(this.getLast()))
            {
                return true;
            }
        }
        return false;
    }
   
    @Override
    public int hashCode()
    {
        return this.getFirst().hashCode() * 7 + this.getLast().hashCode();
    }
}

4.持久化类的映射规则文件 Member.cfg.xml

 代码如下 复制代码

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-9-9 19:50:34 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="org.Rudiment.hibernate">
    <class name="Member" table="TEST_MEMBER">
       <composite-id name="name" class="Name">
               <key-property name="first" type="string" />
               <key-property name="last" type="string" />
       </composite-id>
        <property name="age" column="AGE"></property>
    </class>
</hibernate-mapping>

5.持久化类的操纵类 MemberHandler.java

 代码如下 复制代码

package org.Rudiment.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class MemberHandler {

     public static void insert() {
             Configuration conf = new Configuration();
             conf.configure();
             ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
             SessionFactory sf = conf.buildSessionFactory(sr);
             Session session = sf.openSession();
            session.beginTransaction();
            Member m = new Member();
            m.setAge(24);
           
            Name n = new Name("IT","kezhan");
            m.setName(n);
           
            session.save(m);
            session.getTransaction().commit();
            session.close();
        }
   
    public static void main(String[] args) {
            insert();
    }
}

注:

当运行MemberHandler的时候将发现,后台数据库多了一个 test_member 的数据表,表的内容如下:

 代码如下 复制代码

mysql> select * from test_member;
+-------+--------+------+
| first | last   | AGE  |
+-------+--------+------+
| IT    | kezhan |   24 |
+-------+--------+------+
1 row in set (0.00 sec)

mysql> desc test_member;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| first | varchar(255) | NO   | PRI | NULL    |       |
| last  | varchar(255) | NO   | PRI | NULL    |       |
| AGE   | int(11)      | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

时间: 2024-10-26 20:33:16

Hibernate以组件作为复合主键实例详解的相关文章

Vuejs第十一篇组件之slot内容分发实例详解_javascript技巧

什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. Slot分发内容 ①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下 父组件在子组件内套的内容,是不显示的. 例如代码: <

hibernate注解方式实现复合主键

有时一个实体的主键可能同时为多个,例如同样是之前使用的"CustomerEO"实体,需要通过name和email来查找指定实体,当且仅当name和email的值完全相同时,才认为是相同的实体对象.要配置这样的复合主键,步骤如以下所示. (1)编写一个复合主键的类CustomerPK,代码如下. CustomerPK.java import java.io.Serializable; public class CustomerPK implements Serializable { pu

Android监听Home键实例详解_Android

本文实例讲述了Android监听Home键的方法.分享给大家供大家参考,具体如下: 将到android中Home键的监听,很多人第一反应时重写相应Activity的onKeyDown()方法,监听当按下的键的keyCode为KEYCODE_HOME时,进行自己的相应的处理.如: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { stop

Android监听Home键实例详解

本文实例讲述了Android监听Home键的方法.分享给大家供大家参考,具体如下: 将到android中Home键的监听,很多人第一反应时重写相应Activity的onKeyDown()方法,监听当按下的键的keyCode为KEYCODE_HOME时,进行自己的相应的处理.如: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { stop

Hibernate单向1-1含连接表映射实例详解

Hibernate单向1-1映射范例 其实 Many-to-one 和 one-to-one 非常相似,只需要在 <many-to-one> 的尖括号中添加 unique="true"即可 1.hibernate.cfg.xml  代码如下 复制代码 <!DOCTYPE hibernate-configuration PUBLIC         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

hibernate(jpa)复合主键annotation声明方法

在设计数据库表的时候,往往会设计出带有复合主键的表,即表的记录由多 个字段联合标识,如: 表 CREATE TABLE TB_HOUR_DATA ( STAT_DATE DATE NOT NULL, PATH_ID NUMBER(20) NOT NULL, VALUE VARCHAR2(512 BYTE), TYPE NUMBER(1) NOT NULL ) 其中,复合主键为(STAT_DATE,PATH_ID,TYPE) 针对这种情况,hibernate(jpa) 的 annotation 映

Java的Hibernate框架中复合主键映射的创建和使用教程_java

复合主键映射需要在映射配置文件中使用<composite-id>标签,该标签是指将一个类指定为相应的复合主键,它的name属性需要指定类文件中定义的属性值,并在该标签中添加<key-property>子标签. Note:想要使用复合映射必须要将复合主键放到一个类中,也就是讲复合主键属性和其它属性分到两个类中,并将复合主键的类实现接口Serializable,该接口隶属于java.io. 复合主键的映射关系的主键是由多个列复合而成的,对应到数据表中相当的简单,如下图: 1.类文件这里

hibernate的复合主键 在持久化是主键为Null问题

问题描述 各位大佬们好:我在用s2sh集成做一个bbs论坛系统时,在提交一个帖子时,出现了????NULL???'post_id'??'bbs.dbo.bbs_message'?????????INSERT???freemarker.template.TemplateModelException:Methodpublicjava.lang.Stringorg.hibernate.exception.NestableRuntimeException.getMessage(int)threwanex

hibernate 复合主键 insert时有一个字段用sysdate获得oracle当前时间

问题描述 求问.复合主键insert时有一个字段用sysdate获得oracle当前时间怎么做.试了insert-sql.复合主键的时候有问题.该怎么办?