j2se环境jpa的实现和简单动态切换数据源

        项目中持久层用的eclipselink,有个需求是动态切换数据源,首先做了个demo,先在j2se的环境中实现,然后再尝试加到项目中。

       

        1、创建jpa项目,创建环境,创建eclipselink的user library,用于jpa项目

           j2se环境jpa的实现和简单动态切换数据源_第1张图片

        2、创建jpa项目,将上一步创建的user library加入项目:

      j2se环境jpa的实现和简单动态切换数据源_第2张图片


     3、创建项目结构:

      j2se环境jpa的实现和简单动态切换数据源_第3张图片

     MyDao是创建jpa中的entitymanager对象的,Student是使用的实体,persistence.xml配置了持久化的属性

 

      4、persistence.xml:

    配置了persistence-unit,事务策略、持久化的provider、持久化的class、数据源属性。



	
		org.eclipse.persistence.jpa.PersistenceProvider
       
        	com.tgb.jpa.entity.Student  
		
			  
            		  
            		  
            		  
            		  
            		 
			
		
	

     

    5、MyDao.java:

package com.tgb.jpa.dao;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class MyDao {
	//定义工厂
	private EntityManagerFactory emf;
	//定义entitymanager
	private EntityManager em;
	//获取EntityManager的方法,根据有没有传入url创建不同策略的EntityManager
	public EntityManager getEntityManager(String url){
		//采用persitence.xml中的默认配置
		if (url==""||url==null) {
			emf=Persistence.createEntityManagerFactory("unit");
			em=emf.createEntityManager();
		}else {
			//更改url属性
			Map properties =new HashMap();
			properties.put("javax.persistence.jdbc.url","jdbc:mysql://"+url);
			emf = Persistence.createEntityManagerFactory("unit", properties);
			
			em=emf.createEntityManager();
		}
		return em;
	}
	
	public EntityManager getEntityManager(){
		return getEntityManager(null);
	}
}

         6、Student实体:

package com.tgb.jpa.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_student")
public class Student {

	private String id;
	
	private String name;
	
	private String sex;
	
	private String addr;

	@Id
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
	
}

     7、测试类Client:

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import org.junit.Test;

import com.tgb.jpa.dao.MyDao;
import com.tgb.jpa.entity.Student;

public class Client {

	@Test
	public void testJpa1() {
		MyDao dao=new MyDao();
		//根据persistence.xml配置创建em
		EntityManager entityManager=dao.getEntityManager();
		
		EntityTransaction transaction= (EntityTransaction) entityManager.getTransaction();
		try {

				// 开始事务
				transaction.begin();
				
				Student student=new Student();
				student.setId("1");
				student.setAddr("hebei");
				student.setName("tom");
				student.setSex("men");
				
				
				entityManager.persist(student);
				// 提交事务
				transaction.commit();

			} catch (Exception e) {
				// 事务回滚
				transaction.rollback();
				e.printStackTrace();
			}finally{
				if (entityManager.isOpen()) {
					entityManager.getEntityManagerFactory().close();
				}
			}
	}	
	
	@Test
	public void testJpa2 (){
		MyDao dao=new MyDao();
		//传入url属性,改变emFactory的属性
		EntityManager entityManager=dao.getEntityManager("localhost:3306/jpa2");
		EntityTransaction transaction= (EntityTransaction) entityManager.getTransaction();
		try {

				// 开始事务
				transaction.begin();
				
				Student student=new Student();
				student.setId("2");
				student.setAddr("beijing");
				student.setName("jerry");
				student.setSex("women");
				
				entityManager.persist(student);
				// 提交事务
				transaction.commit();

			} catch (Exception e) {
				// 事务回滚
				transaction.rollback();
				e.printStackTrace();
			}finally{
				if (entityManager.isOpen()) {
					entityManager.getEntityManagerFactory().close();
				}
			}
	}
}

testJpa1()是读取persistence.xml配置文件的属性,就是默认的,执行后数据库添加一条数据:

j2se环境jpa的实现和简单动态切换数据源_第4张图片

jpa1库:

j2se环境jpa的实现和简单动态切换数据源_第5张图片

testJpa2是传入了url,并且根据这个属性改变了EntityManagerFactory的属性,所以连接字符串就变成了传入的jpa2数据库,所以testJpa2的数据添加到了jpa2库中:

j2se环境jpa的实现和简单动态切换数据源_第6张图片


这样就完成了jpa的实现,并且简单实现了切换数据库的需求。

   


你可能感兴趣的:(java)