大家在做开发的时候一定会用到表与表之间一对一的关系.
在学习数据的关联关系时候,请把容器映射看一看.不然不容易理解关联关系.
环境: 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删除.
分享到:
相关推荐
2018年7月5日,Hibernate发布了其最新版本——5.3.2.Final,带来了诸多改进和新特性,为开发者提供了更为高效、稳定的持久化解决方案。 一、Hibernate ORM概述 Hibernate ORM(Object-Relational Mapping)是一种将...
通过深入学习Hibernate 4.1.4.Final的源码,我们可以更好地理解其设计思想,提升我们的编程技巧,同时也能为日常开发中遇到的问题提供解决方案。这是一份宝贵的资源,无论是对于初学者还是经验丰富的开发者,都值得...
7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)关系的映射,方便处理对象间的关联关系。 8. **延迟加载**:Hibernate的懒加载策略可以在需要时才...
在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...
6. @OneToMany、@ManyToOne、@OneToOne、@ManyToMany:表示不同类型的关联关系,如一对一、一对多、多对多。 7. @JoinColumn:用于指定关联字段在表中的具体列名。 8. @Temporal:处理日期和时间类型的字段,如...
标题 "myeclipse试用小记----Hibernate多对一单向关联(1)" 提到的是在MyEclipse集成开发环境中使用Hibernate框架实现多对一单向关联的实践记录。这个主题涉及到Java后端开发中的数据库关系映射和对象持久化技术。 ...
- `@OneToOne`: 一对一关系,一个实体对应另一个实体的唯一实例。 - `@JoinColumn`: 定义外键列的属性,如名称、是否自增等。 - `@JoinTable`: 当关系涉及中间表时,用于定义关联表的属性。 5. **级联操作** - ...
9. **关联映射**:Hibernate支持多种关联类型,如一对一、一对多、多对一、多对多,通过配置文件或注解定义实体间的关联。 10. **性能优化**:Hibernate提供了多种优化手段,如延迟加载(Lazy Loading)、批处理...
级联操作则允许在对一个对象进行操作(如删除或更新)时,自动对关联的对象执行相应的操作。事务管理则是企业级应用中必不可少的,它确保了数据库操作的一致性和可靠性。 这两个库文件的结合使用,使得开发者能够...
Hibernate 4.3.5.Final作为稳定且最终的版本,为开发者提供了一个强大、可靠的持久化解决方案。它集成了最新的JPA规范,增强了查询能力和性能,并提供了友好的错误处理,是Java企业级开发中不可或缺的工具。无论你是...
Hibernate,作为Java领域中的一个著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而非繁琐的SQL语法。在本文中,我们将深入探讨Hibernate 5.4.17.Final这一官方稳定版本,...
在实际应用中,对象之间的关联关系是非常常见的,而Hibernate同样提供了一套完善的解决方案来处理这些关系。本文将以“Hibernate关联关系”为主题,详细介绍Hibernate中关联关系的创建及使用方法。 #### 关联关系...
Hibernate是Java领域中最具影响力的ORM解决方案之一,它允许开发者以面向对象的方式处理数据库交互,消除了传统SQL与Java代码之间的鸿沟。4.2.3版本作为其稳定的一个版本,提供了许多增强的功能和改进,使得开发更加...
6. **关联映射**:Hibernate支持一对一、一对多、多对一、多对多等各种关联映射,通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`等注解实现。 7. **缓存机制**:3.6.6版本继续优化了第二级缓存,通过...
总之,Hibernate EntityManager 3.2 作为一款成熟的 ORM 解决方案,为开发者提供了高效、灵活的数据持久化手段,通过 JPA 规范与 Java 应用程序紧密集成,降低了数据库操作的复杂性,提高了开发效率。理解并熟练掌握...
9. Hibernate 一对一外键双向关联、主键双向关联、连接表双向关联、一对多外键双向关联、一对多连接表双向关联、多对多双向关联: 这些关联方式与单向关联类似,区别在于两个实体类都知道彼此的关联。在双向关联中...
在Hibernate 3.6.10.Final版本中,它提供了全面的对象持久化解决方案,包括数据访问接口、事务处理、查询语言等。 二、安装与配置 解压“hibernate-distribution-3.6.10.Final-dist.zip”文件后,我们可以看到...
是Hibernate组织提供的一种基于Java平台的企业级对象关系映射(ORM)解决方案,它实现了Java Persistence API(JPA),使得Java开发者能够方便地在关系数据库和面向对象的Java应用程序之间进行数据交互。Hibernate ...
Hibernate Search是Hibernate组织推出的一个开源项目,它将全文搜索引擎的功能与Java持久化框架Hibernate相结合,为开发者提供了一种在Java应用中实现高效全文搜索的解决方案。在hibernate-search-3.2.1.Final-dist....
Hibernate支持多种关联关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)。关联映射的配置和使用是Hibernate中的重要环节。 10. **拦截器与事件监听** Hibernate...