`

hibernate映射文件中的id标签以及联合主键

阅读更多

hibernate映射文件中的id标签以及联合主键


一、id标签

       被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性, 为每一个实例包含唯一的标识<id> 元素定义了该属性到数据库表主键字段的映射

 

二、联合场景

学生表Student是由id和name联合形成主键

三、联合主键类的编写

      1)实现java.io.Serializable接口

      2)必须重写equals() 和 hashCode() 方法

 

package com.linys.model;

/**
 * StudentId entity. @author MyEclipse Persistence Tools
 */

public class StudentId implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;

	// Constructors

	/** default constructor */
	public StudentId() {
	}

	/** full constructor */
	public StudentId(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public boolean equals(Object other) {
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof StudentId))
			return false;
		StudentId castOther = (StudentId) other;

		return ((this.getId() == castOther.getId()) || (this.getId() != null
				&& castOther.getId() != null && this.getId().equals(
				castOther.getId())))
				&& ((this.getName() == castOther.getName()) || (this.getName() != null
						&& castOther.getName() != null && this.getName()
						.equals(castOther.getName())));
	}

	public int hashCode() {
		int result = 17;

		result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
		result = 37 * result
				+ (getName() == null ? 0 : this.getName().hashCode());
		return result;
	}

}

三、学生类的编写

 

package com.linys.model;

/**
 * Student entity. @author MyEclipse Persistence Tools
 */

public class Student implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private StudentId id;
	private Integer age;

	// Constructors

	/** default constructor */
	public Student() {
	}

	/** minimal constructor */
	public Student(StudentId id) {
		this.id = id;
	}

	/** full constructor */
	public Student(StudentId id, Integer age) {
		this.id = id;
		this.age = age;
	}

	// Property accessors

	public StudentId getId() {
		return this.id;
	}

	public void setId(StudentId id) {
		this.id = id;
	}

	public Integer getAge() {
		return this.age;
	}

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

}
 

四、映射文件

Student.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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.linys.model.Student" table="student">
        <composite-id name="id" class="com.linys.model.StudentId">
            <key-property name="id" type="java.lang.Integer">
                <column name="id" />
                
            </key-property>
            <key-property name="name" type="java.lang.String">
                <column name="name" length="50" />
            </key-property>
        </composite-id>
        <property name="age" type="java.lang.Integer">
            <column name="age" />
        </property>
    </class>
</hibernate-mapping>
 

其中:

<composite-id 指定联合主键的信息

 <key-property 指定在StudentId类中的联合信息

五、测试类

 

 

package com.linys.model;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestUniPk {

	static SessionFactory sf;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		sf = new Configuration().configure().buildSessionFactory();

	}

	@Test
	public void testUniPk(){
		StudentId stuId=new StudentId();
		//stuId.setId(1);
		stuId.setName("linys");
		
		Student stu=new Student();
		stu.setAge(23);
		stu.setId(stuId);
		
		Session session =sf.openSession();
		Transaction tr=session.beginTransaction();
		session.save(stu);
		tr.commit();
		session.save(stu);
		
		
	}
	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		sf.close();
	}

}
 

 

 

 

 

分享到:
评论

相关推荐

    Hibernate注解映射联合主键

    在Hibernate中,有三种主要的注解方式来映射联合主键,以下是对这三种方式的详细解释: 1. **使用`@Embeddable`和`@Id`** 在这种映射方式中,联合主键的字段被放在一个单独的类中,这个类需要实现`java.io....

    Hibernate联合主键的例子

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

    hibernate的联合主键怎么设置

    在映射文件中,`&lt;composite-id&gt;` 标签用于声明联合主键,`&lt;key-property&gt;` 标签则指定了每个主键属性及其对应的数据库列。 4. **使用 Hibernate API**: 有了以上配置,你就可以在程序中通过 Hibernate API 来...

    hibernate复合主键映射

    复合主键映射 &lt;br&gt;通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用&lt;composite-id&gt;标签进行映射,其它属性采用正常映射

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

    在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...

    hibernate复合主键配置和使用

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

    Hibernate映射

    【标题】:“Hibernate映射” 在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,将Java类与数据库表之间的关系进行了抽象,使得开发者可以像操作对象一样操作数据库。...

    Hibernate一对一单向外键关联 (联合主键annotation)

    通过这种方式,你可以实现Hibernate中一对一单向外键关联及联合主键的配置。这使得两个实体间的关系更加明确,同时也方便了数据的管理和操作。在实际项目中,这样的设计可以提高数据的完整性和一致性。

    hibernate复合主键的实例

    如果使用XML映射文件,需要在`&lt;class&gt;`元素中指定`&lt;composite-id&gt;`。例如: ```xml &lt;hibernate-mapping&gt; &lt;composite-id name="key" class="com.example.CompositeKey"&gt; ...

    hibernate映射继承关系(每个类都对应一张表)

    本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,我们需要理解这个映射策略的基本概念。在"每个类都对应一张表"的映射中,每个类(包括基类和所有子类)都会在数据库中被映射为一张独立的表。...

    hibernate中文帮助文档

    除了标准的EJB3注解,Hibernate还提供了一些自定义注解,如`@GeneratedValue`用于设置主键生成策略,`@Formula`用于在属性中使用SQL表达式,`@Cache`用于配置缓存,`@Filter`用于动态过滤数据,以及`@Parent`用于...

    Hibernate继承映射

    【Hibernate继承映射】是Java开发中...以上就是关于Hibernate继承映射、一对一关系、组件映射以及HQL的基础知识,这些概念和实践技巧在Java企业级开发中非常常见,熟练掌握能有效提高数据操作的效率和代码的可维护性。

    Hibernate学习笔记_songjignhao_1

    联合主键映射涉及到多个字段共同构成主键的情况,可以使用 `&lt;composite-id&gt;` 标签来定义这些字段,并通过 `&lt;key-property&gt;` 或 `&lt;key-many-to-one&gt;` 子标签映射每个组成部分。 组件映射允许我们将一个类的属性映射...

    Hibernate 系列教程 单向一对多

    在Hibernate中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,我们来看单向一对多关联的基本概念。在Java类中,我们将有一个“一”的类(如`Department`)和一个“多”的类(如`Employee`)。在`...

    Hibernate 3.1.2中文文档

    11. **继承映射**:Hibernate支持单表继承、联合继承和表-per-hierarchy等多种继承策略,使得对象模型的继承关系可以映射到数据库。 12. **代理(Proxy)**:Hibernate利用Java的动态代理机制,在需要时懒加载关联...

    hibernate之一对一关联映射

    在Hibernate中,我们通常通过配置XML映射文件(hbm.xml)或使用注解来实现一对一关联。以XML为例,我们需要在两个实体类的映射文件中添加关联配置。假设我们有实体类`Person`和`Address`,`Person`拥有的`Address`...

    hibernate之关于关联映射的综合应用

    - 在多对多关联中,如果使用自动生成的主键,确保中间表的主键是由两个外键构成的联合主键,而不是额外的自增ID。 - 检查关联关系的配置,确保关系的维护端正确,避免循环更新导致的问题。 综上所述,Hibernate的...

    Hibernate中文API大全

    以下是这个例子的Hibernate映射文件: &lt;id name="Key" column="pid" type="string"&gt; &lt;/id&gt; &lt;component name="Name" class="eg.Name"&gt; &lt;!-- class attribute optional --&gt; 人员(Person)表...

Global site tag (gtag.js) - Google Analytics