采用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>();
相关文章推荐
- 【hibernate框架】使用Annotation注解进行实体类操作
- hibernate使用注解无法进行更新操作的解决方法
- SpringBoot入门-6(利用jpa连接hibernate,并进行生成表,对表的增加,删除,查询操作)
- hibernate反向工程生成带注解的实体(jpa)
- EJB3.0-JPA实体的注解规范以及Hibernate特有的扩展
- JPA & Hibernate 注解
- 详细理解java Hibernate 或 JPA的级联操作
- hibernate如何进行批量的数据操作,防止内存溢出
- Hibernate注解与JPA
- (Hibernate)JPA注解总结
- spring 2.5整合jdbc进行数据库操作和注解事务控制
- hibernate jpa 注解 @Temporal(TemporalType.DATE) 格式化时间日期,页面直接得到格式化类型的值
- Hibernate,JPA注解@SecondaryTables
- Springboot 之 使用JPA进行分页操作
- 在Java的Hibernate框架中对数据库数据进行查询操作
- JPA &amp; Hibernate 注解
- Hibernate(JPA)注解大全
- Struts2+Spring2.5+JPA(Hibernate3)环境搭建,使用注解
- day58:hibernate04_JPA注解方式实现hibernate CRUD--【用户添加角色没那摩神秘】
- webwork+spring+hibernate进行数据增删查改操作时出现NullPointerException异常