【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)
1. 摘要
地址表:





package org.crazyit.app.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="address_inf")
public class Address
{
// 标识属性
@Id @Column(name="address_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int addressId;
// 定义地址详细信息的成员变量
private String addressDetail;
// 无参数的构造器
public Address()
{
}
// 初始化全部成员变量的构造器
public Address(String addressDetail)
{
this.addressDetail = addressDetail;
}
// addressId的setter和getter方法
public void setAddressId(int addressId)
{
this.addressId = addressId;
}
public int getAddressId()
{
return this.addressId;
}
// addressDetail的setter和getter方法
public void setAddressDetail(String addressDetail)
{
this.addressDetail = addressDetail;
}
public String getAddressDetail()
{
return this.addressDetail;
}
}
Person.java

- @JoinColumn :用于定义外键,数据库层面的,name值是数据表中的字段值;
- @ManyToOne :java类层面的;
- @Cascade : 设置级联,系统先自动级联插入主表记录,再插入从表记录==>因为在插入从表(N)记录时,指定的外键不能为null,所以在插入从表记录之前,需要有对应的主表(1)记录存在,若不存在对应的主表记录,则会报错。这里设置@Cascade ,可以保证在主表记录还没有插入而是先插入了从表记录时,Hibernate会自动先将主表记录保存,然后再保存从表记录。这就是级联的意思。
package org.crazyit.app.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
@Table(name="person_inf")
public class Person
{
// 标识属性
@Id @Column(name="person_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
// 定义该Person实体关联的Address实体
@ManyToOne(targetEntity=Address.class)
// 映射外键列,指定外键列的列名为address_id、不允许为空
@JoinColumn(name="address_id" , nullable=false)
@Cascade(CascadeType.ALL)
private Address address;
// id的setter和getter方法
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return this.id;
}
// name的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
// age的setter和getter方法
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
// address的setter和getter方法
public void setAddress(Address address)
{
this.address = address;
}
public Address getAddress()
{
return this.address;
}
}

package lee;
import org.crazyit.app.domain.Address;
import org.crazyit.app.domain.Person;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class PersonManager
{
public static void main(String[] args)
{
PersonManager mgr = new PersonManager();
mgr.testCascase();
HibernateUtil.sessionFactory.close();
}
private void testCascase()
{
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Person p = new Person();
Address a = new Address("SuZhou"); // ①
p.setName("ZhangSan");
p.setAge(21);
p.setAddress(a);
// 持久化Person对象
session.persist(p);
// 创建一个瞬态的Address对象
Address a2 = new Address("ShangHai"); // ②
// 修改持久化状态的Person对象
p.setAddress(a2); // ③
tx.commit();
HibernateUtil.closeSession();
}
private void testPerson()
{
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
// 创建一个Person对象
Person p = new Person();
// 设置Person的name为crazyit字符串
p.setName("WangWu");
p.setAge(21);
// 持久化Person对象(对应于插入主表记录)
session.save(p);
// 创建一个瞬态的Address对象
Address a = new Address("GuangZhou"); // ①
// 先设置Person和Address之间的关联关系
p.setAddress(a);
// 再持久化Address对象(对应于插入从表记录)
session.persist(a);
// 创建一个瞬态的Address对象
Address a2 = new Address("BeiJing"); // ②
// 先设置Person和Address之间的关联关系
p.setAddress(a2);
// 再持久化Address对象(对应于插入从表记录)
session.persist(a2); // ③
tx.commit();
HibernateUtil.closeSession();
}
}


【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)的更多相关文章
- Hibernate学习笔记(四)关系映射之一对一关联映射
一. 一对一关联映射 ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 Ø 主键关联:即让 ...
- Hibernate学习笔记(四)—— 表与表的关系
一.一对多|多对一 1.1 关系表达 1.1.1 表中的表达 建表原则:在多的一方创建外键指向一的一方的主键. 1.1.2 实体中的表达 [客户实体] public class Customer { ...
- Hibernate学习笔记(一)-->数据库单表操作
Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibern ...
- hibernate学习笔记(4)表单操作
User.hbm.xml的表单配置: ①主键 <id name="id" type="java.lang.Integer"> <column ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- Django学习笔记(五)—— 表单
疯狂的暑假学习之 Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path ...
- Flutter学习笔记(13)--表单组件
如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...
随机推荐
- webbrowser 静音(刷新、点击网页的声音)(包括flash静音)
public enum INTERNETFEATURELIST { FEATURE_OBJECT_CACHING = 0, FEATURE_ZONE_ELEVATION = 1, FEATURE_MI ...
- bzoj2662
题解: spfa最短路径 dp[i][j]表示到i,用了j掌权 然后转移 代码: #include<bits/stdc++.h> using namespace std; ; int n, ...
- pyqt(二) 创建第一个程序(helloworld)解决object has no attribute 'setCentralWidget'
1.运行Qt Creator QtCreator主界面分为了6个模式:欢迎模式.编辑模式.设计模式.Debug调试模式.项目模式和帮助模式,分别由左侧的6个图标进行切换,对应的快捷键是Ctrl + 数 ...
- INTEL NUC下一代计算机 怎么进bios,进不去bios
手上有个 英特尔® NUC 套件 DE3815TYKHE 玩具一样,200大洋收来的,配置不高,配了个4G内存,加上以前的2.5笔记本硬盘. 放家里当个小服务器玩吧,挺省电的. BIOS 开启fast ...
- Java——线程定时器
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- QLabel 内容长度超过控件本身长度时超出的部分用省略号
void JunEditableLabel::setText(const QString &string) { QFont font("Tahoma"); font.set ...
- 3.1 shell简介、变量、运算符
小知识: ipcs可以查看系统中创建的ipc进程间通信资源,例如信号量.共享内存等.示例如下: 什么是shell? shell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程 ...
- Apache和iis的冲突处理
http://wenku.baidu.com/link?url=N4GYFpkQyr8G0kVEy3AR2Q5FBho8EOle-_5inEfEq6QSxlyzB3xSbcpeugRdExkSU-tw ...
- OK335xS CAN device register and deiver match hacking
/************************************************************************* * OK335xS CAN device regi ...
- [LeetCode&Python] Problem 559. Maximum Depth of N-ary Tree
Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...