采用JPA对Hibernate进行注解操作

本文详细介绍了Java Persistence API (JPA) 的基本概念及其与Hibernate框架的结合应用,重点阐述了多表映射关系,包括一对多、多对多关系的具体配置方法。

JPA概述
全称是:Java Persistence API。是SUN公司推出的一套基于ORM的规范。hibernate框架中提供了JPA的实现。
JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

首先要创建配置文件:要求在 src 下面的 META-INF 文件夹下面创建一个名称为 persistence.xml 的文件。
 如下:
 
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	
	<!--Name属性用于定义持久化单元的名字 (name必选,空值也合法); transaction-type 指定事务类型(可选) 取值: JTA:默认值 
		RESOURCE_LOCAL -->
	<persistence-unit name="myPersistUnit" transaction-type="RESOURCE_LOCAL">
		<!-- javax.persistence.PersistenceProvider接口的一个实现类 -->
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
		
		<!-- 显式列出实体类,在Java SE 环境中应该显式列出(也可以不写). -->
		<class>cn.shuai.domain.Customer</class>
		
		<!--厂商专有属性(可选) 我们用的Hibernate,后面都是hibernate.cfg.xml中配置 -->
		<properties>
			<!-- 生成DDL的策略 -->
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<!-- 数据库的连接信息 -->
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpahibernate" />
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password" value="1112" />
			<!-- 指定方言 -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
			<!-- 是否显示SQL语句 -->
			<property name="hibernate.show_sql" value="true" />
			<!-- 是否格式化SQL语句 -->
			<property name="hibernate.format_sql" value="true" />
		</properties>
	</persistence-unit>
</persistence>  
 
解释一下常用的注解:

@Entity:作用:指定当前是实体类,写上此注解用于在创建SessionFactory时,加载映射配置。

@Table:作用:指定实体类和表之间的关系。属性:name:指定数据库表的名称。

@Id:作用:指定当前字段是主键。

@Column:作用:指定实体类属性和数据库表之间的对应关系。

  属性:name:指定数据库表的列名称

unique:是否唯一

nullable:是否可以为空

inserttable:是否可以插入

updateable:是否可以更新

columnDefinition:定义建表时创建此列的DDL

secondaryTable:从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。

@GenerateValue:作用:指定主键的生成方式。

   属性:strategy指定主键生成策略

主键的生成策略:

通过annotation(注解)来映射hibernate实体的,基于annotationhibernate主键标识为@Id,  其生成规则由@GeneratedValue设定的.这里的@id@GeneratedValue都是JPA的标准用法JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO

table:使用一个特定的数据库表格来保存主键(了解)

sequence:根据底层数据库的序列来生成主键,条件是数据库支持序列。

identity:主键由数据库自动生成(mysql可用)。

auto:主键有由程序控制。

JPA的多表映射            

一对多关系映射(默认一方放弃外键维护,默认延迟加载)

@OneToMany:作用:建立一对多的关系映射

属性:targetEntityClass:指定多的多方的类的字节码。

  mappedBy:指定从表实体类中引用主表的对象的名称。

  cascade:指定要使用的级联操作

  fetch:指定是否采用延迟加载

  orphanRemoval:是否使用孤儿删除

@ManyToOne:作用:建立多对一关系

  属性:targetEntityClass:指定一的一方实体类字节码

cascode:指定要使用的级联操作

fetch:指定是否采用延迟加载

optional:关联是否可选。如果设置为false,则必须始终存在非空关系。

@JoinColumn:作用:用于定义主键字段和外键字段的对应关系。

  属性:name:指定外键字段的名称

referenceColumnName:指定引用主表的主键字段民称

unique:是否唯一,默认不唯一

nullable:是否允许为空,默认值允许

insertable:是否允许插入,默认值允许

updatable:是否允许更新,默认值允许

columnDefinition:列的定义信息

一对多举例(客户和联系人为例):

客户实体类(主表,一方的表):

@Entity
//设置表名为
@Table(name="customer")
public class Customer implements Serializable {
	//配置ID
	@Id
	//表中的主键
	@Column(name="cid")
	//配置主键生成策略
	@GenericGenerator(name="ontomany",strategy="native")
	@GeneratedValue(generator="ontomany")
	private Integer cid;
	@Column(name="cname")
	private String cname;
	@Column(name="csex")
	private String csex;
	//targetEntity指定多的一方的类的字节码对象,mappedBy指定从表实体类中引用主表的对象的名称
	/*@OneToMany(targetEntity=LinkMan.class,mappedBy="customer",
	 * cascade={CascadeType.PERSIST,CascadeType.MERGE})*/
	//注意:多对多中不能配All,可能会删除全部信息
	@OneToMany(targetEntity=LinkMan.class,mappedBy="customer",cascade=CascadeType.ALL)
	private Set<LinkMan> linkmans = new HashSet<LinkMan>();
	//下面的set/get方法就不写了

联系人实体类(从表,多方的表):

//声明为实体
@Entity
//建立表的名称
@Table(name="linkman")
public class LinkMan implements Serializable{
	//配置ID
	@Id
	//配置表中的主键的值
	@Column(name="lid")
	//配置主键生成策略
	@GenericGenerator(name="manytoone",strategy="native")
	@GeneratedValue(generator="manytoone")
	private Integer lid;
	@Column(name="lname")
	private String lname;
	@Column(name="lsex")
	private String lsex;
	@ManyToOne(targetEntity=Customer.class)
	/* name属性外键的名称,referencedColumnName:映射的主表的主键的名称(是字段的名称,不是JavaBean的属性)
	 */
	@JoinColumn(name="cid",referencedColumnName="cid")
	private Customer customer;

多对多关系的映射(不操作的一方放弃外键维护,默认延迟加载)

@ManyToMany:作用:用于映射多对多的关系

属性:cascode:配置级联操作。

  fetch:配置是否采用延迟加载

  targetEntity:配置目标的实体类,映射多对多的时候不用写

mappedBy:指定另一个多方实体类中引用该表的对象的名称。

@JoinTable:作用:针对中间表的配置

属性:name:配置中间表的名称

  joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段

  inverseJoinColumn:中间表的外键字段关联对方表的主键字段

@JoinColumn:作用:用于定于主键字段和外键字段的对应关系。

  属性:name:指定外键字段的名称。

referencedColumnName:指定引用主表的主键字段的名称

unique:是否唯一,默认值不唯一

nullable:是否允许为空,默认值允许

inserttable:是否允许插入,默认值允许

updatable:是否允许更新,默认允许

columnDefinition:列的定义信息

 

多对多举例(用户和角色为例):

用户实体类:

//配置Entity指定实体
@Entity
@Table(name="user")
public class User implements Serializable{
	//配置主键生成策略
	@Id
	@Column(name="uid")
	@GenericGenerator(name="umanytomany",strategy="native")
	@GeneratedValue(generator="umanytomany")
	private Integer uid;
	@Column(name="uname")
	private String uname;
	@Column(name="usex")
	private String usex;
	@ManyToMany(targetEntity=Role.class,cascade={CascadeType.PERSIST,CascadeType.MERGE})
	//name中间表的名称,joinColumns和用户做主外键关联,inverseJoinColumns和角色做主外键关联
	@JoinTable(name="user_role",joinColumns={@JoinColumn(name="uid",referencedColumnName="uid")},inverseJoinColumns={@JoinColumn(name="rid",referencedColumnName="rid")})
	private Set<Role> roles = new HashSet<Role>();

角色实体类:

@Entity
@Table(name="role")
public class Role implements Serializable{
	@Id
	@Column(name="rid")
	@GenericGenerator(name="rmanytomany",strategy="native")
	@GeneratedValue(generator="rmanytomany")
	private Integer rid;
	@Column(name="rname")
	private String rname;
	@Column(name="rsex")
	private String rsex;
	//放弃外键的维护mappedBy="roles",让直接找User类中的roles去设置外键
	@ManyToMany(targetEntity=User.class,mappedBy="roles")
	private Set<User> users = new HashSet<User>();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值