JPA学习笔记

一、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()

    但注意如下!

1.当保存的对象为临时状态时。manager会复制一个新对象,然后把保存对象里的值给set进去然后保存
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());
		
	}











 
 
 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值