您的位置:首页 > 其它

采用JPA对Hibernate进行注解操作

2017-11-03 20:38 344 查看

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实体的,基于annotation的hibernate主键标识为@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>();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息