Hibernate ManyToOne Mappings 多对一关联映射
1、创建Hibernate的配置文件(hibernate.cfg.xml)
2、创建持久化类,即事实上例须要保存到数据库中的类(Employee.java)
3、创建对象-关系映射文件(Employee.hbm.xml)4、通过Hibernate API编写訪问数据库的代码
样例:多个员工相应一个地址。
<?xml version="1.0" encoding="utf-8"?
>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- Assume testone is the database name -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/testMany2One</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.show_sql">true</property>
<!-- List of XML mapping files -->
<mapping resource="resource/Employee.hbm.xml" />
</session-factory>
</hibernate-configuration>
二、创建持久化类。即事实上例须要保存到数据库中的类(Employee.java、Address.java)
package com.jiangge.hblearn;
/**
* @author jiangge
*/
public class Employee
{
private int id;
private String firstName;
private String lastName;
private int salary;
private Address address;
public Employee()
{
}
public Employee(String firstName, String lastName, int salary,
Address address)
{
this.firstName = firstName;
this.lastName = lastName;
this.salary = salary;
this.address = address;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
public int getSalary()
{
return salary;
}
public void setSalary(int salary)
{
this.salary = salary;
}
public Address getAddress()
{
return address;
}
public void setAddress(Address address)
{
this.address = address;
}
}
package com.jiangge.hblearn;
/**
* @author shijiangge
* @version 2014-7-4 上午11:05:39
*
*/
public class Address
{
private int id;
private String street;
private String city;
private String state;
private String zipcode;
public Address()
{
}
public Address(String street, String city, String state, String zipcode)
{
this.street = street;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getStreet()
{
return street;
}
public void setStreet(String street)
{
this.street = street;
}
public String getCity()
{
return city;
}
public void setCity(String city)
{
this.city = city;
}
public String getState()
{
return state;
}
public void setState(String state)
{
this.state = state;
}
public String getZipcode()
{
return zipcode;
}
public void setZipcode(String zipcode)
{
this.zipcode = zipcode;
}
}
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
address INT NOT NULL,
PRIMARY KEY (id)
);
create table ADDRESS (
id INT NOT NULL auto_increment,
street_name VARCHAR(40) default NULL,
city_name VARCHAR(40) default NULL,
state_name VARCHAR(40) default NULL,
zipcode VARCHAR(10) default NULL,
PRIMARY KEY (id)
);
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Hibernate Many-to-One 关联关系:
非常多员工能够相应一个地址。
0基础的程序猿手写 Employee.hbm.xml 映射文件,而高级程序猿使用XDoclet, Middlegen and AndroMDA这些技术,自己主动生成映射文件。
meta 标签是可选的,用来描写叙述类。
Hibernate的主键生成策略:
【identity】採用数据库提供的主键生成机制。
如DB2、SQL Server、MySQL 中的主键生成机制。
【native】由 Hibernate 依据使用的数据库自行推断採用 identity、hilo、sequence 当中一种作为主键生成方式。
-->
<hibernate-mapping>
<class name="com.jiangge.hblearn.Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native" />
</id>
<property name="firstName" column="first_name" type="string" />
<property name="lastName" column="last_name" type="string" />
<property name="salary" column="salary" type="int" />
<many-to-one name="address" column="address" class="com.jiangge.hblearn.Address" not-null="true" />
</class>
<class name="com.jiangge.hblearn.Address" table="ADDRESS">
<meta attribute="class-description">
This class contains the address detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native" />
</id>
<property name="street" column="street_name" type="string" />
<property name="city" column="city_name" type="string" />
<property name="state" column="state_name" type="string" />
<property name="zipcode" column="zipcode" type="string" />
</class>
</hibernate-mapping>
package test;
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.jiangge.hblearn.Address;
import com.jiangge.hblearn.Employee;
/**
* 測试类:CRUD操作
* @author jiangge
*
*/
public class ManageEmployee
{
private static SessionFactory factory;
public static void main(String[] args)
{
try
{
factory = new Configuration().configure().buildSessionFactory();
}
catch (Throwable ex)
{
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have one address object */
Address address = ME.addAddress("Kondapur", "Hyderabad", "AP", "532");
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address); //("Manoj", "Kumar", 4000, address);
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address);//("Dilip", "Kumar", 3000, address);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an address record in the database */
public Address addAddress(String street, String city, String state, String zipcode)
{
Session session = factory.openSession();
Transaction tx = null;
Integer addressID = null;
Address address = null;
try
{
tx = session.beginTransaction();
address = new Address(street, city, state, zipcode);
addressID = (Integer) session.save(address);
tx.commit();
}
catch (HibernateException e)
{
if (tx != null)
tx.rollback();
e.printStackTrace();
}
finally
{
session.close();
}
return address;
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname, int salary,
Address address)
{
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try
{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary, address);
employeeID = (Integer) session.save(employee);
tx.commit();
}
catch (HibernateException e)
{
if (tx != null)
tx.rollback();
e.printStackTrace();
}
finally
{
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees()
{
Session session = factory.openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();)
{
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Address add = employee.getAddress();
System.out.println("Address ");
System.out.println("\tStreet: " + add.getStreet());
System.out.println("\tCity: " + add.getCity());
System.out.println("\tState: " + add.getState());
System.out.println("\tZipcode: " + add.getZipcode());
}
tx.commit();
}
catch (HibernateException e)
{
if (tx != null)
tx.rollback();
e.printStackTrace();
}
finally
{
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary)
{
Session session = factory.openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
Employee employee = (Employee) session.get(Employee.class,
EmployeeID);
employee.setSalary(salary);
session.update(employee);
tx.commit();
}
catch (HibernateException e)
{
if (tx != null)
tx.rollback();
e.printStackTrace();
}
finally
{
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID)
{
Session session = factory.openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
Employee employee = (Employee) session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}
catch (HibernateException e)
{
if (tx != null)
tx.rollback();
e.printStackTrace();
}
finally
{
session.close();
}
}
}
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+---------+
| id | first_name | last_name | salary | address |
+----+------------+-----------+--------+---------+
| 1 | Manoj | Kumar | 5000 | 1 |
+----+------------+-----------+--------+---------+
1 row in set
mysql> select * from ADDRESS;
+----+-------------+-----------+------------+---------+
| id | street_name | city_name | state_name | zipcode |
+----+-------------+-----------+------------+---------+
| 1 | Kondapur | Hyderabad | AP | 532 |
+----+-------------+-----------+------------+---------+
1 row in set
mysql>
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into ADDRESS (street_name, city_name, state_name, zipcode) values (?, ?
, ?
, ?)
Hibernate: insert into EMPLOYEE (first_name, last_name, salary, address) values (?, ?, ?
, ?)
Hibernate: insert into EMPLOYEE (first_name, last_name, salary, address) values (?, ?, ?, ?
)
Hibernate: select employee0_.id as id0_, employee0_.first_name as first2_0_, employee0_.last_name as last3_0_, employee0_.salary as salary0_, employee0_.address as address0_ from EMPLOYEE employee0_
First Name: Manoj Last Name: Kumar Salary: 4000
Address
Hibernate: select address0_.id as id1_0_, address0_.street_name as street2_1_0_, address0_.city_name as city3_1_0_, address0_.state_name as state4_1_0_, address0_.zipcode as zipcode1_0_ from ADDRESS address0_ where address0_.id=?
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Dilip Last Name: Kumar Salary: 3000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
Hibernate: select employee0_.id as id0_0_, employee0_.first_name as first2_0_0_, employee0_.last_name as last3_0_0_, employee0_.salary as salary0_0_, employee0_.address as address0_0_ from EMPLOYEE employee0_ where employee0_.id=?
Hibernate: update EMPLOYEE set first_name=?, last_name=?, salary=?, address=? where id=?
Hibernate: select employee0_.id as id0_0_, employee0_.first_name as first2_0_0_, employee0_.last_name as last3_0_0_, employee0_.salary as salary0_0_, employee0_.address as address0_0_ from EMPLOYEE employee0_ where employee0_.id=?
Hibernate: delete from EMPLOYEE where id=?
Hibernate: select employee0_.id as id0_, employee0_.first_name as first2_0_, employee0_.last_name as last3_0_, employee0_.salary as salary0_, employee0_.address as address0_ from EMPLOYEE employee0_
First Name: Manoj Last Name: Kumar Salary: 5000
Address
Hibernate: select address0_.id as id1_0_, address0_.street_name as street2_1_0_, address0_.city_name as city3_1_0_, address0_.state_name as state4_1_0_, address0_.zipcode as zipcode1_0_ from ADDRESS address0_ where address0_.id=?
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
Hibernate ManyToOne Mappings 多对一关联映射的更多相关文章
- 6.Hibernate单向的多对一 关联映射
1.创建如下项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding="UTF-8& ...
- Hibernate框架单向多对一关联映射关系
建立多对一的单向关联关系 Emp.java private Integer empNo //员工编号 private String empName / ...
- Hibernate框架双向多对多关联映射关系
建立双向多对多关联关系 Project.java (项目表) private Integer proid; private Strin ...
- Hibernate框架单向多对多关联映射关系
建立单向多对多关联关系 Project.java (项目表) private Integer proid; private Strin ...
- 一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- hibernate之关于使用连接表实现多对一关联映射
[Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...
随机推荐
- 备份MySQL数据库的方法
前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么 ...
- linux编译
文章一 1)用户点击编译程序时,编译程序将C++源代码转换成目标代码,目标代码通常由 机器指令和记录如何将程序加载到内存的信息组成.其后缀通常为.obj或.o: 2)目标文件中存储的只是用户所编写的代 ...
- Linux环境下编译JDK
环境准备 操作系统,ubuntu-14.04.6-desktop-amd64.iso,下载地址:http://59.80.44.100/releases.ubuntu.com/14.04/ubuntu ...
- Mac下安装和使用GunPG(GPG)
GPG是加解密的工具,亦可以用于签名.非对称加解密.需要公钥和私钥. mac下安装:brew install gpg 使用gpg工具校验下载文件的完整性,从官网下载KEYS和asc文件:gpg --i ...
- 详解RocketMQ中的consumer
上述就是MQ中有关Consumer的类图,下面来介绍一下每个类 1.MQAdmin:底层类,上篇博客已经提过,就不再此重提 2.MQConsumer:Consumer公共的接口,常用的方法如下 如果消 ...
- VS中的 MD/MT设置 【转】
VS系列工具作为目前微软主打的集成开发环境,在历经了近20多年的发展后,到如今已经可以 说是Windows平台上各种IDE环境中的翘楚了.很多别的开发工具已经难望其项背了,如今VS2010也已经面市很 ...
- PS 基础知识 CMYK全称是什么
已解决 请问谁知道CMYK四色的英文全称? 悬赏分:20 - 解决时间:2006-9-6 16:23 C代表什么颜色?英文全称是什么? M代表什么颜色?英文全称是什么? Y代表什么颜色?英文全称是什么 ...
- css3 - 动态伪类
动态伪类分为以下几种: 1. hover(经过) 2. active(点击后) 3. focus(聚焦) - input专用 4. visited(访问后) 使用:
- 最全的HTTP头部信息分析
HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Chars ...
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...