`

联合主键--xml

阅读更多

需求:  在T_STUDENTS表中 要将ID和NAME联合作为主键:

 

1.将id和name属性定义到一个主键类中:StudentPK 并重写hashCode()和equals()方法同时要继承Serializable接口

 

package com.zchen.hibernate.sxt.domain;

import java.io.Serializable;

public class StudentPK implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7880746333829652369L;
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	/*@Override
	public boolean equals(Object o){
		if(o instanceof StudentPK){
			StudentPK pk = (StudentPK)o;
			if(this.id == pk.getId() && this.name.equals(pk.getName())){
				return true;
			}
		}
		return false;
	}
	@Override
	public int hashCode(){
		return this.name.hashCode();
	}*/
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		StudentPK other = (StudentPK) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

}

 

2.定义实体类: Students 将主键类放到里面:

package com.zchen.hibernate.sxt.domain;

public class Students {
	private StudentPK pk;

	public StudentPK getPk() {
		return pk;
	}

	public void setPk(StudentPK pk) {
		this.pk = pk;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	private int age;

	private String address;

}

 

3.定义Students.hbm.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">
<hibernate-mapping package="com.zchen.hibernate.sxt.domain">

    <class name="Students" table="T_STUDENTS">
        <composite-id name="pk" class="com.zchen.hibernate.sxt.domain.StudentPK">
        	<key-property name="id" column="ID"/>
        	<key-property name="name" column="NAME"/>
        </composite-id>
        <property name="age" column="AGE"/>
        <property name="address" column="ADDRESS"/>
    </class>

</hibernate-mapping>

 

 

4.定义配置文件:Hibernate.cfg.xml  略

<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql:///db_czbk_hibernate</property>
		<property name="connection.username">root</property>
		<property name="connection.password">1234</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hbm2ddl.auto">create</property>
		<property name="current_session_context_class">thread</property>
		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
		<property name="show_sql">true</property>
		 <mapping resource="com/zchen/hibernate/sxt/domain/Students.hbm.xml" />
	</session-factory>
</hibernate-configuration>

 

 5.测试用例:

package com.zchen.hibernate.sxt.test;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.zchen.hibernate.sxt.domain.StudentPK;
import com.zchen.hibernate.sxt.domain.Students;


public class StudentsTest {
	
	private static SessionFactory sf = null;
	
	@BeforeClass
	public static void beforeClass(){
		try {
			sf = new AnnotationConfiguration().configure().buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void addStduentTest(){
		StudentPK pk = new StudentPK();
		pk.setId(1);
		pk.setName("zchen");
		
		Students s = new Students();
		s.setAge(24);
		s.setAddress("北京");
		s.setPk(pk);

		Session session = sf.getCurrentSession();
		session.beginTransaction();
		
		session.save(s);
		
		session.getTransaction().commit();
	}
	
	@AfterClass
	public static void afterClass(){
		if(sf != null){
			try {
				sf.close();
			} catch (HibernateException e) {
				e.printStackTrace();
			}
		}
	}


}

 

 

输出语句:

11:32:09,818  INFO SchemaExport:226 - Running hbm2ddl schema export
11:32:09,821 DEBUG SchemaExport:242 - import file not found: /import.sql
11:32:09,821  INFO SchemaExport:251 - exporting generated schema to database
11:32:09,822 DEBUG SchemaExport:377 - drop table if exists T_STUDENTS
11:32:09,879 DEBUG SchemaExport:377 - create table T_STUDENTS (ID integer not null, NAME varchar(255) not null, AGE integer, ADDRESS varchar(255), primary key (ID, NAME))
11:32:09,953  INFO SchemaExport:268 - schema export complete
Hibernate: insert into T_STUDENTS (AGE, ADDRESS, ID, NAME) values (?, ?, ?, ?)

 

分享到:
评论

相关推荐

    hibernate联合主键全攻略

    在探讨Hibernate中联合主键的使用时,我们首先需要理解什么是联合主键以及它在Hibernate框架中的实现方式。联合主键(Composite Primary Key),是指在数据库表中使用两个或多个字段共同作为主键来唯一标识每一行...

    Hibernate联合主键的例子

    如果你使用的是XML映射文件,你需要在`.hbm.xml`文件中指定联合主键。如果使用注解,上述实体类已经包含了必要的信息。 4. **持久化操作:** 在MyEclipse中,你可以使用Hibernate工具或手动编写代码来执行CRUD...

    hibernate的联合主键怎么设置

    在 Hibernate 中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这种主键在数据库设计中常见于需要多个字段唯一标识一条记录的情况。在 Hibernate 中设置联合主键通常需要以下几个步骤: 1. **...

    Hibernate教程08_关系映射之联合主键

    本教程聚焦于“联合主键”这一概念,它在处理复合唯一标识符时非常有用。联合主键(Composite Key)是指由两个或多个字段共同组成的主键,这些字段单独可能不是唯一的,但组合起来确保了数据的唯一性。 在Hibernate...

    hibernate复合主键的实例

    在某些情况下,单一字段无法唯一标识表中的记录,此时需要多个字段联合起来作为主键。例如,考虑一个学生选课表,可能包含"学生ID"和"课程ID",这两者结合才能唯一确定学生选修的特定课程。 三、Hibernate中复合...

    Mybatis--Generator生成例子

    - `&lt;table&gt;`:每个元素代表一个数据库表,你可以设置生成的类名、是否生成主键字段等属性。 - `&lt;jdbcConnection&gt;`:定义数据库连接信息,包括driverClass、connectionURL、userId和password。 - `...

    hibernate many-to-many级联保存,级联更新,级联删除

    在Hibernate中,这种关系通过中间关联表(也称为连接表或联合表)来实现,该表包含两个实体的主键作为其外键。 二、配置Many-to-Many关系 在Hibernate配置文件(如hibernate.cfg.xml)中,你需要为实体类定义映射...

    mybatis反向工程.根据数据库表生成wrapper xml文件和类

    在实际开发中,主键的生成策略多种多样,包括自增(AUTO)、联合主键等。例如,`@Id`注解可以配合`GeneratedValue`注解来定义主键的生成策略。当使用自增主键时,通常在数据库层面设置,MyBatis或MyBatis-Plus会自动...

    hibernate复合主键配置和使用

    在XML配置时代,我们需要在Hibernate的映射文件(.hbm.xml)中显式声明复合主键。现在,大多数项目都使用注解配置,但如果你仍然需要处理旧的项目,这里是如何配置的示例: ```xml &lt;hibernate-mapping&gt; ...

    mybatis联表查询mapper.xml

    在"mybatis联表查询mapper.xml"中,主表和副表的关系是通过主键外键关联的。主表通常有一条记录对应副表的多条记录,这在数据库设计中称为一对多(1:N)关系。为了在查询时一并获取副表的数据,我们可以使用MyBatis...

    传智播客JPA学习笔记修改免积分版

    - 当单个字段不足以唯一标识一条记录时,可以考虑使用联合主键。 - **实现方式**: - 通过在实体类上使用 @IdClass 注解来定义联合主键。 通过上述内容的梳理,我们可以清晰地了解到 JPA 的核心概念、关键技术和...

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part2

    ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,Hibernate多表联合查询, ...

    MyBatis-3-User-Guide-Simplified-Chinese.rar

    - **结果映射**: 可以直接将查询结果映射到Java对象,也可以通过`&lt;resultMap&gt;`定义复杂映射规则,如联合主键、一对一、一对多、多对多等。 6. **缓存机制** MyBatis 提供了本地缓存和二级缓存两种机制,可以提高...

    Hibernate 系列教程 单向一对多

    为了提高性能,我们可以使用`fetch="join"`(XML映射)或`@Fetch(FetchMode.JOIN)`(注解)进行联合查询,一次性获取所有关联的数据。 理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的...

    Hibernate各种数据库关联annotatian和XML的配置集锦

    对于多对一关系,如果总是成对出现,可以考虑使用联合主键或单向关联。 - 使用二级缓存:通过配置Hibernate的二级缓存,可以减少对数据库的访问,提高系统性能。 - HQL与SQL:使用HQL(Hibernate Query Language)...

    mycat 主键自增代码

    Mycat 支持多种主键生成策略,包括:UNIONID(联合ID)、SEQUENCE(序列号)、TABLE(表序列)、UUID 和 AUTO_INCREMENT(自增)。其中,AUTO_INCREMENT 策略是与 MySQL 自增主键类似的方式,适用于单表插入操作。...

    ssh多主键插入

    多主键,也称为复合主键或联合主键,指的是在一个数据表中使用两个或更多的字段共同作为唯一标识符,确保每条记录的唯一性。这种设计常见于关系型数据库中,当单一字段不足以唯一标识一条记录时采用。例如,在一个...

    hibernate学习笔记

    1. 使用`@IdClass`或XML中的`composite-id`定义联合主键。 2. 联合主键需要重写equals和hashCode方法,实现Serializable接口。 七、Hibernate核心接口 1. `Configuration`接口: - 提供了管理配置信息的方法,用于...

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part1

    ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,Hibernate多表联合查询, ...

Global site tag (gtag.js) - Google Analytics