一、JPA概念
JPA是ORM规范。hibernate是作为orm框架,同时也是实现
二.最简单的demo搭建
导入jar
主要代码如下
persistence.xml
实体bean:
User.java
package com.xy.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="name")
@Entity
public class User {
private String userName;
private Integer UserId;
private Integer age;
private String Address;
/**
* 对应字段为USER_NAME
*/
@Column(name="USER_NAME")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
*设置主键为userid,同时对应字段为user_id,生成策略自动
*/
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="USER_ID")
@Id
public Integer getUserId() {
return UserId;
}
public void setUserId(Integer userId) {
UserId = userId;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
}
testMain
package com.xy.model;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class TestJPA {
public static void main(String[] args) {
//1.创建 EntityManagerFactory,传入参数为persistence.xml里面的<persistence-unit name="JPA_Demo" transaction-type="RESOURCE_LOCAL">
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA_Demo");
//2.得到entityManager
EntityManager manager = factory.createEntityManager();
//3.开启事务
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
//4.进行数据操作
User user = new User();
user.setUserName("xuyi");
user.setAge(1);
user.setAddress("new york");
manager.persist(user);
//5.提交事务
transaction.commit();
//6.关闭
manager.close();
factory.close();
}
}
结果如下:
最简单demo完成!
三.基本注解
放在实体类名前:
@Entity --标记为实体类,默认表名为类名
@Table(name="表名") --设置对应映射表名
放在字段方法前:
@Id --通常放在get方法上面,设置该属性为主键
@generatedValue(strategy=GenerationType.方法) --设置主键生成的方法
方法:identity 采用数据库自增的方式
auto 自动选择(默认为这个)
sequence 通过序列的方式(mysql不支持)
table 通过表来产生主键
@basic 默认自动加在了getXXX方法前
@Column(name=" 映射表名",length="字段长度",nullable=false)--映射表字段名
@Transient --设置该属性不映射表字段
@temporal(TempralType.时间类型) --指定时间类型
时间类型:TIMESTAMP,DATE,Time
四 .API
1.Persistence
Persistence.createEntityManagerFactory("persisten.xml里面的until-name");
Persistence.createEntityManagerFactory("persisten.xml里面的until-name",propertyMap);
--propertyMap为放置配置文件的map,相当于xml里面的
例如
主要用于获取EntityManagerFactory。
2.EntityManagerFactory---主要用于创建entityManager
EntityManager manager = factory.createEntityManager();
EntityManager manager = factory.createEntityManager(Map map);--创建manager提供属性
factory.isOpen();
factory.close();
3.EntityManager
manager.find(实体.class,object id); --类似session.findById(.class,id);
manager.getReference(实体.class,object id); --先得到代理对象,当执行持久对象操作的时候,才进行查询!类似session.load
manager.remove(Object object); --删除持久化对象
manager.persist(Object object); --保存一个对象(不能进行ID设定)
EntityTransaction transaction = manager.getTransaction();
----
manager.merge(T entity) --相当于session.saveOrUpdate()
但注意如下!
2.当保存的对象为游离对象,但是在manager的缓存和数据库里面寻找ID。如果有对应的。则取出这个持久化对象
,并且将游离
对象的值赋给持久化对象。进行update;
3.当保存的对象为游离对象,但是在manager的缓存和数据库里面找不到,则new一个新对象,把游离对象的值赋
给新对象。再保存
manager.flush() --相当于session.flush
manger.refresh() --相当于session.refresh
manager.close();
manager.contain(); --判断是否属于当前持久上下文环境管理的实体
manager.clear();--清楚上下文环境
4.EntityTransaction
transacation.isActive() ---查看当前事务是否是活动
transacation.begin()
transaction.commit()
transaction.rollback
transaction.close();
五.关联关系
1.映射单向n-1的关联关系
使用@ManyToOne(fetch=FetchType.LAZY)(懒加载,默认不是懒加载策略) 来映射多对一的关联关系
使用@JoinColumn(name="外键名")来映射外键
package com.xy.model;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name="Content")
@Entity
public class Content {
private Integer id;
private String title;
private String article;
private User user;
@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
@JoinColumn(name="user_id")
@ManyToOne(fetch=FetchType.LAZY)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
@Test
public void testManytoOneInsert(){
User user = new User();
user.setUserName("AB");
user.setAge(123);
Content content1 = new Content();
content1.setTitle("AAA");
content1.setUser(user);
Content content2 = new Content();
content2.setTitle("BBB");
content2.setUser(user);
manager.persist(user);
manager.persist(content1);
manager.persist(content2);
}
2.单向1-N的关联关系
使用@oneToMany来映射1-n的关联关系
使用@JoinColumn(那么="外建名")来映射外键列的名称
package com.xy.model;
import java.util.Set;
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.OneToMany;
import javax.persistence.Table;
@Table(name="user")
@Entity
public class User {
private String userName;
private Integer userId;
private Integer age;
private String address;
private Set<Order> orders;
/**
* 对应字段为USER_NAME
*/
@Column(name="USER_NAME")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
*设置主键为userid,同时对应字段为user_id,生成策略自动
*/
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="USER_ID")
@Id
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [userName=" + userName + ", userId=" + userId + ", age="
+ age + ", address=" + address + "]";
}
@JoinColumn(name="user_id")
@OneToMany
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
@Test
public void testOneToMany(){
// User user = new User();
// user.setAddress("TTT");
// user.setUserName("ttt");
// Order order1 = new Order();
// order1.setOrderItem("AA");
// order1.setOrderName("AA+");
// Order order2 = new Order();
// order2.setOrderItem("BB");
// order2.setOrderName("BB+");
// Set<Order> orders = new HashSet<>();
// orders.add(order1);
// orders.add(order2);
//
// user.setOrders(orders);
//
// manager.persist(order1);
// manager.persist(order2);
// manager.persist(user);
User user = manager.find(User.class, 18);
System.out.println(user.getOrders());
}