`
ttitfly
  • 浏览: 623906 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hibernate------one-to-one

阅读更多
hibernate 关系映射 one-to-one主要有三种实现方式
1.通过外键方式实现
以学生和电脑为例(Student-Computer)
建表sql语句:
CREATE DATABASE `onetoone`
CHARACTER SET 'utf8';

USE `onetoone`;

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `computer`;
CREATE TABLE `computer` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `student_id` int(11) ,
  foreign key (`student_id`) references student(`id`),
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Student.java:
package com.domain;


public class Student implements java.io.Serializable {

	private Integer id;

	private String name;

	private Computer computer;

	public Student() {
	}

	public Student(String name) {
		this.name = name;
	}

	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 Computer getComputer() {
		return computer;
	}

	public void setComputer(Computer computer) {
		this.computer = computer;
	}

	
}

Computer.java:
package com.domain;

public class Computer implements java.io.Serializable {

	private Integer id;

	private Student student;

	private String name;


	public Computer() {
	}


	public Computer(String name) {
		this.name = name;
	}


	public Computer(Student student, String name) {
		this.student = student;
		this.name = name;
	}

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

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

	public Student getStudent() {
		return this.student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

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

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

}

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">

<hibernate-mapping>
    <class name="com.domain.Student" table="student" catalog="onetoone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" not-null="true" />
        </property>
        <!-- class可以不写,因为根据name的值computer(属性),会通过反射自动找到属于哪个类的 -->
        <one-to-one cascade="delete,save-update" name="computer" class="com.domain.Computer" property-ref="student"></one-to-one>
    </class>
</hibernate-mapping>


Computer.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.domain.Computer" table="computer" catalog="onetoone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
       
        <property name="name" type="java.lang.String">
            <column name="name" not-null="true" />
        </property>
        
         <!-- many开头的是代表该表持有外键 -->
        <many-to-one  name="student" class="com.domain.Student"  unique="true">
            <column name="student_id" />
        </many-to-one>
    </class>
</hibernate-mapping>


测试类:
package com.domain;

import org.hibernate.Query;
import org.hibernate.Session;

import com.util.HibernateSessionFactory;

public class Test {
	
	public static void main(String[] args){
		Session session = HibernateSessionFactory.getSession();
		
		//save
		Student student = new Student();
		student.setName("student9");
		
		Computer computer = new Computer();
		computer.setName("Intel 9");
		
		//computer.setStudent(student)和student.setComputer(computer);都必须要
		computer.setStudent(student);
		student.setComputer(computer);
		
		session.save(student);
		
		/**
		 执行的sql:
		 Hibernate: insert into onetoone.student (name) values (?)
		 Hibernate: insert into onetoone.computer (name, student_id) values (?, ?)
		 */
		
//		
		session.beginTransaction().commit();
		
		//query
		
//		String hql = "from Student where name=?";
//		Query query = session.createQuery(hql);
//		query.setString(0, "student3");
//		
//		Student student = (Student)query.uniqueResult();
//		System.out.println(student.getId() + " : " + student.getComputer().getName());
		
		
		//delete
//		Student student = (Student)session.load(Student.class, new Integer(1));
//		session.delete(student);
//		session.beginTransaction().commit();
		
		/**
		 执行的sql为:
	Hibernate: select student0_.id as id0_1_, student0_.name as name0_1_, computer1_.id as id1_0_, computer1_.name as name1_0_, computer1_.student_id as student3_1_0_ from onetoone.student student0_ left outer join onetoone.computer computer1_ on student0_.id=computer1_.student_id where student0_.id=?
	Hibernate: delete from onetoone.computer where id=?
	Hibernate: delete from onetoone.student where id=?
		 */
		
		
		session.close();
	}

}


2.通过主键方式实现(一个表的主键由另一个表的主键决定),在这里Computer的主键由Student的主键决定。
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">

<hibernate-mapping>
    <class name="com.domain.Student" table="student" catalog="onetoone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" not-null="true" />
        </property>
        <!-- class可以不写,因为根据name的值computer(属性),会通过反射自动找到属于哪个类的 
        <one-to-one cascade="delete,save-update" name="computer" class="com.domain.Computer" property-ref="student"></one-to-one>
    	-->
    	<one-to-one name="computer"/>
    </class>
</hibernate-mapping>


Comuter.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.domain.Computer" table="computer" catalog="onetoone">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <!--generator class="native" /-->
            
            <!--Computer的主键由Student的主键决定,可以看成是外键-->
            <generator class="foreign">
            	<param name="property">student</param>
            </generator>
        </id>
       
        <property name="name" type="java.lang.String">
            <column name="name" not-null="true" />
        </property>
        
         <!-- many开头的是代表该表持有外键
        <many-to-one  name="student" class="com.domain.Student"  unique="true">
            <column name="student_id" />
        </many-to-one> -->
        <one-to-one name="student"/>
    </class>
</hibernate-mapping>


TestMainKey.java:

package com.domain;

import org.hibernate.Session;

import com.util.HibernateSessionFactory;

public class TestMainKey {

	public static void main(String[] args){
		Session session = HibernateSessionFactory.getSession();
		
		//save
		Student student = new Student();
		student.setName("student15");
		
		Computer computer = new Computer();
		computer.setName("Intel 15");
		
		
		computer.setStudent(student);
//		student.setComputer(computer);
		//因为save 2个表,所以不需要双向赋值
		session.save(student);
		session.save(computer);
		
		session.beginTransaction().commit();
		session.close();
	}
}





3.通过关系表实现:
DROP TABLE IF EXISTS `st`;
create table stu_com(
	stu_id int not null,
	com_id int not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

<!--optional="true"的意思是只有当stu_id 和 com_id 都不为空时才在关系表里插入。这样也会插入

2遍,所以需要inverse="true"把一方设置为虚的。即不让插入到关系表中-->
<join table="stu-com" optional="true" inverse="true">
	<key column="com_id"/>
	<many-to-one name="student" column="stu_id" unique="true"/>
</join>
分享到:
评论
2 楼 gaolegao2008 2011-07-14  
版主写的好
1 楼 stevenzuo 2009-02-10  
楼主写的经典呀!

相关推荐

    Hibernate one-to-many / many-to-one关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    (4)Hibernate中的many-to-one和one-to-many关系

    本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射可以通过 `&lt;many-to-one&gt;` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml &lt;many-to-one name="idCard" column="card_id...

    Hibernate-one-to-many

    本文将深入探讨Hibernate中一对多(One-to-Many)关系的处理方式,特别是通过外键映射和inverse属性的应用场景。 #### 一对多关系概念 一对多关系在数据库设计中非常常见,它指的是一个实体可以与多个其他实体关联...

    hibernate many-to-one(多对一)及 cascade(级联).doc

    在Hibernate中,可以通过 `&lt;many-to-one&gt;` 或者 `&lt;one-to-many&gt;` 标签中的 `cascade` 属性来指定这种行为。 #### 代码示例解析 在提供的代码示例中,`&lt;many-to-one&gt;` 标签中包含了 `cascade` 属性的注释示例,但是...

    hibernate-shards.jar

    distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify...

    Hibernate应用例子one-to-one

    【Hibernate应用例子one-to-one】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它允许开发者以面向对象的方式操作数据库,从而简化了数据库应用程序的开发。在Hibernate中,"one-to-one"(一对一)关联是...

    hibernate-release-5.0.7.Final.zip官方

    &lt;one-to-many class="Order"/&gt; ``` ```java @Entity public class User { @Id private Long id; private String name; @Fetch(FetchMode.JOIN) @OneToMany(mappedBy = "user") private List&lt;Order&gt;...

    hibernate学习5之one-to-many双向关联.docx

    而`Classes.hbm.xml`则使用了`&lt;set&gt;`和`&lt;one-to-many&gt;`元素,表示班级对象包含一个学生集合,且每个学生都有对应的`id`。 在处理这种关联关系时,需要注意的是效率问题。由于Hibernate默认会在"一"端更新关联关系,...

    Hibernate Tutorial 04 (Many-to-one and One-to-one Association

    在 `Book` 类中,我们可以添加一个指向 `Author` 的属性,并在映射文件中使用 `&lt;one-to-one&gt;` 标签。 ```xml &lt;!-- 其他属性的映射 --&gt; &lt;one-to-one name="author" class="Author" column="AUTHOR_ID" cascade=...

    hibernate:one-to-one

    hibernate:one-to-one 的学习小经验

    (3)Hibernate3.2 中的 one-to-one关系

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它用于表示两个实体之间一对一的映射关系。本篇将深入探讨Hibernate 3.2中的一对一关系,以及如何在实际项目中...

    hibernate-mapping

    例如,`&lt;one-to-one&gt;`、`&lt;many-to-one&gt;`、`&lt;one-to-many&gt;`和`&lt;many-to-many&gt;`元素分别对应这四种关系。关联映射通常涉及外键的处理和级联操作。 5. 注解方式的Mapping 除了XML映射,Hibernate还支持注解方式的映射...

    Hibernate one-to-many-annotation

    在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...

    hibernate-dtd

    映射文件`*.hbm.xml`则是Hibernate对象与数据库表之间的映射定义,DTD在这里定义了如`&lt;class&gt;`、`&lt;table&gt;`、`&lt;id&gt;`、`&lt;property&gt;`、`&lt;many-to-one&gt;`等元素的结构。通过这些元素,开发者可以详细指定Java类与数据库表...

    Hibernate-api Hibernate文档

    - One-to-Many:一对多关联。 - Many-to-One:多对一关联。 - Many-to-Many:多对多关联。 十、Inheritance Mapping Hibernate支持三种继承映射策略:Single Table、Table Per Class Hierarchies 和 Table Per ...

    hibernate最新版jar包(全)

    10. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)、多对多(Many-to-Many)关系**: Hibernate支持这四种数据库关联关系,通过不同的注解配置来实现。 **使用Hibernate的步骤** 1. **...

    hibernate-one-to-one-uni

    本项目“hibernate-one-to-one-uni”专注于探讨和实现Hibernate框架中的一对一(One-to-One)关系映射,这种关系在数据库设计中比较常见,用于表示两个实体之间一对一的联系。 一对一关系映射在Hibernate中分为两种...

    Hibernate Mapping Many-to-One 实例 内附源代码及附件下载

    对于`Department`,映射文件中会有一个`&lt;class&gt;`标签,其中包含`&lt;set&gt;`标签来定义员工集合,并且使用`&lt;many-to-many&gt;`或`&lt;one-to-many&gt;`标签来映射与`Employee`的关系。对于`Employee`,我们使用`&lt;class&gt;`标签,并在...

    Hibernate-One-To-One

    【标题】:“Hibernate-One-To-One”详解 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。本主题主要关注的是Hibernate中的一个关键概念——一对一(One-To-One)关联...

Global site tag (gtag.js) - Google Analytics