`
java心如止水
  • 浏览: 32016 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据关联关系之一(一对一)--Hibernate解决方案.

阅读更多

   大家在做开发的时候一定会用到表与表之间一对一的关系.
   在学习数据的关联关系时候,请把容器映射看一看.不然不容易理解关联关系.
  
环境: Myeclispe+mysql.

(1) 创建表

--刪除表
drop table if exists email ;
drop table if exists person ;

--新建表
create table person
(
 id int not null auto_increment primary key ,
 name varchar(20) not null ,
 age int
) ;

create table email
(
 id int ,
 ema varchar(20) not null,
 time varchar(20) ,
 foreign key (id) references person(id) on delete cascade  
) ;

--提交
commit ;

(2) Peson.java 类

package org.hibernate.onetoone.vo;

public class Person {
 private int id ;
 private String name ;
 private int age ;
 private Email e  ;
 
 public Email getE() {
  return e;
 }
 public void setE(Email e) {
  this.e = e;
 }
 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;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 
}

(3) Person.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="org.hibernate.onetoone.vo.Person" table="person"  >
     <id name="id" type="java.lang.Integer" >
      <column name="id"></column>
      <generator class="increment"></generator>
     </id>
     <property name="name" type="java.lang.String">
      <column name="name"></column>
     </property>
     <property name="age" type="java.lang.Integer">
      <column name="age"></column>
     </property>
     
     <one-to-one  name="e" class="org.hibernate.onetoone.vo.Email"
      lazy="false"  cascade="all" outer-join="true"   >
     </one-to-one>
     
    </class>
</hibernate-mapping>


(4) Email.java类

package org.hibernate.onetoone.vo;

public class Email {
 private int id ;
 private String ema ;
 private String time ;
 private Person p ;
 
 
 public Person getP() {
  return p;
 }
 public void setP(Person p) {
  this.p = p;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getEma() {
  return ema;
 }
 public void setEma(String ema) {
  this.ema = ema;
 }
 public String getTime() {
  return time;
 }
 public void setTime(String time) {
  this.time = time;
 }
 
}

(5) Email.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="org.hibernate.onetoone.vo.Email" table="email"  >
  <id name="id" type="java.lang.Integer">
   <column name="id"></column>
   <generator class="foreign">
    <param name="property">p</param>
   </generator>
  </id>
  <property name="ema" type="java.lang.String">
   <column name="ema"></column>
  </property>
  <property name="time" type="java.lang.String">
   <column name="time"></column>
  </property>
  <one-to-one name="p" class="org.hibernate.onetoone.vo.Person"
    constrained="true" >
  </one-to-one>
  
 </class>
</hibernate-mapping>

(6)测试类.

package org.hibernate.onetoone.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;
import org.hibernate.onetoone.vo.Email;
import org.hibernate.onetoone.vo.Person;

public class PersonDao {
 private Session session ;
 public PersonDao()
 {
  session = new Configuration().configure().buildSessionFactory()
     .openSession() ;
 }
 
 public void insert(Person p)
 {
  session.save(p) ;
  session.beginTransaction().commit() ;
  session.close() ;
 }
 
 public void deletebyid(int id)
 {
  String hql = "delete from Person as p where p.id=?" ;
  Query q = session.createQuery(hql) ;
  q.setInteger(0, id) ;
  q.executeUpdate() ;
  session.beginTransaction().commit() ;
  session.close() ;
 }
 
 public Person fingbyid(int id)
 {
  Criteria c = session.createCriteria(Person.class) ;
  c.add(Expression.eq("id",id)) ;
  List l = c.list() ;
  if(l.size()>0)
   return (Person)l.get(0) ;
  return null ;
 }
 
 public void update(Person p)
 {
  session.update(p) ;
  session.beginTransaction().commit() ;
  session.close() ;
 }
 
 public static void main(String[] args)
 {
  PersonDao pd = new PersonDao() ;
  
//级联插入 
//如果在Person.hbm.xml中将 <one-to-one  name="e" class="org.hibernate.onetoone.vo.Email"
//lazy="false"  cascade="all" outer-join="true"   > 中的 cascade="all" 去掉的话,那么
//下面的插入将只能将Peson插入到数据库中,而不能同时将Email插入到数据库中, 因为 cascade=all是这是级联关系属性.
//all是设置成所以的级联, 当然还可以设置成其他的,如果只是更新时级联,只是删除时级联,只是插入时级联.  
//  Person p = new Person () ;
//  p.setName("lisi") ;
//  p.setAge(10) ;
//  Email e = new Email() ;
//  e.setEma("123@163.com") ;
//  e.setTime("10") ;
//  //Person中有Email. Email中有Person.
//  e.setP(p) ;
//  p.setE(e) ;
//  pd.insert(p) ;
  
//级联更新
  //此处的Person对象必须到数据库中查询,而不能通过new出来.因为,数据库中查出来的Person
  //中把他的Email带出来,大家可以在fingbyid()在后台输出的sql语句就知道.
//  Person p = pd.fingbyid(2) ;
//  p.setName("wangwu") ;
//  p.setAge(100) ;
//  p.getE().setEma("wangwu@163.com") ;
//  pd.update(p) ;
  
//级联删除
  //Email.hbm.xml中的one-to-one节点的 constrained="true"
  //属性是设置约束, 如果不设置这个约束在在删除Person的时候,不会把Person的Emil删除.
  pd.deletebyid(5) ;
 }
}

分析:
 在Person.hbm.xml中将 <one-to-one  name="e" class="org.hibernate.onetoone.vo.Email"
       lazy="false"  cascade="all" outer-join="true" >中cascade="all" 去掉的话,那么插入函数将只
 能将Peson插入到数据库中,而不能同时将Email插入到数据库中, 因为 cascade=all是这是级联关系属性.
 所谓级联关系:当主控方执行操作时,关联(被动方)是否同步执行同一操作.当然还可以设置成其他的,如果只是更新时
       级联,只是删除时级联,只是插入时级联.
 
      Email.hbm.xml中的one-to-one节点的 constrained="true"属性是设置约束, 如果不设置这个约束在在删除
     Person的时候,不会把Person的Emil删除.

 

分享到:
评论
2 楼 tangbo530 2008-07-12  
你是来贴代码的?
1 楼 tangbo530 2008-07-12  
你是来贴代码的?

相关推荐

    hibernate-release-5.3.2.Final

    2018年7月5日,Hibernate发布了其最新版本——5.3.2.Final,带来了诸多改进和新特性,为开发者提供了更为高效、稳定的持久化解决方案。 一、Hibernate ORM概述 Hibernate ORM(Object-Relational Mapping)是一种将...

    hibernate源码release-4.1.4.Final版

    通过深入学习Hibernate 4.1.4.Final的源码,我们可以更好地理解其设计思想,提升我们的编程技巧,同时也能为日常开发中遇到的问题提供解决方案。这是一份宝贵的资源,无论是对于初学者还是经验丰富的开发者,都值得...

    hibernate-release-5.2.10

    7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)关系的映射,方便处理对象间的关联关系。 8. **延迟加载**:Hibernate的懒加载策略可以在需要时才...

    hibernate使用主键关联的一对一关系

    在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...

    hibernate-common-annotations.jar

    6. @OneToMany、@ManyToOne、@OneToOne、@ManyToMany:表示不同类型的关联关系,如一对一、一对多、多对多。 7. @JoinColumn:用于指定关联字段在表中的具体列名。 8. @Temporal:处理日期和时间类型的字段,如...

    myeclipse试用小记----Hibernate多对一单向关联(1)

    标题 "myeclipse试用小记----Hibernate多对一单向关联(1)" 提到的是在MyEclipse集成开发环境中使用Hibernate框架实现多对一单向关联的实践记录。这个主题涉及到Java后端开发中的数据库关系映射和对象持久化技术。 ...

    hibernate-annotations-3.4.0.GA.rar

    - `@OneToOne`: 一对一关系,一个实体对应另一个实体的唯一实例。 - `@JoinColumn`: 定义外键列的属性,如名称、是否自增等。 - `@JoinTable`: 当关系涉及中间表时,用于定义关联表的属性。 5. **级联操作** - ...

    ejb3-persistence.jar hibernate-annotations.jar

    级联操作则允许在对一个对象进行操作(如删除或更新)时,自动对关联的对象执行相应的操作。事务管理则是企业级应用中必不可少的,它确保了数据库操作的一致性和可靠性。 这两个库文件的结合使用,使得开发者能够...

    hibernate-release-4.3.5.Final.zip

    Hibernate 4.3.5.Final作为稳定且最终的版本,为开发者提供了一个强大、可靠的持久化解决方案。它集成了最新的JPA规范,增强了查询能力和性能,并提供了友好的错误处理,是Java企业级开发中不可或缺的工具。无论你是...

    hibernate-release-5.4.17.Final.zip

    Hibernate,作为Java领域中的一个著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而非繁琐的SQL语法。在本文中,我们将深入探讨Hibernate 5.4.17.Final这一官方稳定版本,...

    Hibernate关联关系

    在实际应用中,对象之间的关联关系是非常常见的,而Hibernate同样提供了一套完善的解决方案来处理这些关系。本文将以“Hibernate关联关系”为主题,详细介绍Hibernate中关联关系的创建及使用方法。 #### 关联关系...

    hibernate-release-4.2.3.lib.zip

    Hibernate是Java领域中最具影响力的ORM解决方案之一,它允许开发者以面向对象的方式处理数据库交互,消除了传统SQL与Java代码之间的鸿沟。4.2.3版本作为其稳定的一个版本,提供了许多增强的功能和改进,使得开发更加...

    hibernate-distribution-3.6.6.Final-dist

    6. **关联映射**:Hibernate支持一对一、一对多、多对一、多对多等各种关联映射,通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`等注解实现。 7. **缓存机制**:3.6.6版本继续优化了第二级缓存,通过...

    hibernate-entitymanager-3.2.jar.zip

    总之,Hibernate EntityManager 3.2 作为一款成熟的 ORM 解决方案,为开发者提供了高效、灵活的数据持久化手段,通过 JPA 规范与 Java 应用程序紧密集成,降低了数据库操作的复杂性,提高了开发效率。理解并熟练掌握...

    Hibernate关联映射

    9. Hibernate 一对一外键双向关联、主键双向关联、连接表双向关联、一对多外键双向关联、一对多连接表双向关联、多对多双向关联: 这些关联方式与单向关联类似,区别在于两个实体类都知道彼此的关联。在双向关联中...

    hibernate-distribution-3.6.10.Final-dist.zip

    在Hibernate 3.6.10.Final版本中,它提供了全面的对象持久化解决方案,包括数据访问接口、事务处理、查询语言等。 二、安装与配置 解压“hibernate-distribution-3.6.10.Final-dist.zip”文件后,我们可以看到...

    hibernate-jpa.jar

    是Hibernate组织提供的一种基于Java平台的企业级对象关系映射(ORM)解决方案,它实现了Java Persistence API(JPA),使得Java开发者能够方便地在关系数据库和面向对象的Java应用程序之间进行数据交互。Hibernate ...

    hibernate-search-3.2.1.Final-dist.zip

    Hibernate Search是Hibernate组织推出的一个开源项目,它将全文搜索引擎的功能与Java持久化框架Hibernate相结合,为开发者提供了一种在Java应用中实现高效全文搜索的解决方案。在hibernate-search-3.2.1.Final-dist....

    hibernate-release-5.0.12.Final.rar

    Hibernate支持多种关联关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)。关联映射的配置和使用是Hibernate中的重要环节。 10. **拦截器与事件监听** Hibernate...

    hibernate-annotations-3.4.0.jar

    3. **关联关系注解**:Hibernate支持一对一、一对多、多对一和多对多的关联关系。例如,`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`分别对应这四种关系。关联关系可以通过`@JoinColumn`或`@JoinTable`...

Global site tag (gtag.js) - Google Analytics