现在的位置: 首页 > 综合 > 正文

hibernate many-to-one

2013年08月09日 ⁄ 综合 ⁄ 共 2749字 ⁄ 字号 评论关闭

多对一含义:会在多的一端加个外键指向一的一方,外键Id是由<many-to-one> 属性中的columu定义,忽略默认是实体名字一致

基础配置:                  

 <many-to-one name="dept" class="org.ymm.entity.Dept" cascade="save-update" >
       <column name="DEPTNO" precision="2" scale="0" />
 </many-to-one>

1

name:属性名。

2

column(可选):外键字段的名称。也可以通过嵌套的 <column> 指定。

3

class(可选 — 默认是通过反射得到的属性类型):被关联的类的名字。

4

cascade(级联)(可选)表明操作是否从父对象级联到被关联的对象。

5

fetch(可选 — 默认为 select):在外连接抓取(outer-join
fetching)和序列选择抓取(sequential select fetching)两者中选择其一。

6

update, insert(可选 — 默认为 true)指定对应的字段是否包含在用于 UPDATE 和/或 INSERT 的
SQL 语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过 trigger(触发器)、或其他程序生成。

7

property-ref:(可选)被关联到此外键的类中的对应属性的名字。如果没有指定,被关联类的主键将被使用。

8

access(可选 — 默认为 property):Hibernate
用来访问属性值的策略。

9

unique(可选):使用 DDL 为外键字段生成一个唯一约束。此外, 这也可以用作 property-ref 的目标属性。这使关联同时具有一对一的效果。

10

not-null(可选):使用 DDL 为外键字段生成一个非空约束。

11

optimistic-lock(可选 — 默认为 true):指定这个属性在做更新时是否需要获得乐观锁定(optimistic
lock)。换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。

12

lazy(可选 — 默认为 proxy):默认情况下,单点关联是经过代理的。lazy="no-proxy" 指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche
lazily)(需要运行时字节码的增强)。lazy="false" 指定此关联总是被预先抓取。

13

not-found(可选 - 默认为exception):指定如何处理引用缺失行的外键:ignore 会把缺失的行作为一个空关联处理。

14

entity-name(可选):被关联的类的实体名。

15

formula(可选):SQL 表达式,用于定义 computed(计算出的)外键值。

理解级联(cascade):all,save-update,persist,delete,lock,delete

                                 连锁操作 (对增删改 起作用)

dept和emp表测试

package org.ymm.test;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.ymm.entity.Dept;
import org.ymm.entity.Emp;

public class Test {
//	public static void main(String[] args) {
//		Configuration configur=new Configuration().configure();
//		SessionFactory sf=configur.buildSessionFactory();
//		Session  session =sf.openSession();
//		Transaction t=session.beginTransaction();
//		
//		//多对一查询
//		Emp e=(Emp) session.get(Emp.class, 7369);
//		System.out.println(e.getDept().getDname());
//		
//		t.commit();
//		session.close();
//	}
	
//	public static void main(String[] args) {
//		Configuration configur=new Configuration().configure();
//		SessionFactory sf=configur.buildSessionFactory();
//		Session  session =sf.openSession();
//		Transaction t=session.beginTransaction();
//		
//		Dept d=new Dept(); 
//		d.setDeptno(12);
//		d.setDname("xx");
//		//一的这边必须是持久状态 可以用cascade属性先保存,也可以自己用session保存
//		//session.save(d);
//		
//		Emp e =new Emp();
//		e.setEmpno(12);
//		e.setEname("xxmm");
//		e.setDept(d);
//		
//		session.save(e);
//		
//		t.commit();
//		session.close();
//	}
	
	public static void main(String[] args) {
		Configuration configur = new Configuration().configure();
		SessionFactory sf = configur.buildSessionFactory();
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();

		Dept d = (Dept) session.load(Dept.class, 11);
		// 一的这边必须是持久状态 可以用cascade属性先保存,也可以自己用session保存
		// session.save(d);

		Emp e = new Emp();
		e.setEmpno(11);
		e.setEname("xx11");
		e.setDept(d);

		session.saveOrUpdate(e);

		t.commit();
		session.close();
	}
}

                              

抱歉!评论已关闭.