jpa多数据源处理

项目中需要多个数据库,而且每个数据库的基本信息都是保存在一个公共库(public)的sysarea表中的:表格式如下




AREA_ID
AREA_NAMEEN
AREA_DATABASE
AREA_DBNAME
AREA_DBPWD
AREA_DBSERVE
1
数据库1
infodb1
root
111111
192.168.1.1
2
数据库1
infodb2
root
111111
192.168.1.2


persistence.xml 文件如下:

[code="xml"]org.hibernate.ejb.HibernatePersistencejava:comp/env/jdbc/PUBLICDBorg.hibernate.ejb.HibernatePersistence[/code]


根据数据库名称取链接属性类:

[code="java"]public class AreaFactory {

private static final Map> map = new HashMap>();

private static final String SHOWSQL = HttpContext.getConfig().getString(AppConfig.SHOWSQL);

private static AreaFactory areaFactory = new AreaFactory();

public static AreaFactory getInstance (){
return areaFactory;
}

public Map getAreaMap(String unitName) {
Map mp = map.get(unitName);
if (mp == null) {
mp = new HashMap();
UnitDAO unitDAO = DAOFactory.getInstance().getUnitDAO();
SysArea sysArea = unitDAO.findArea(unitName);
if (sysArea != null) {
mp.put("hibernate.connection.url", "jdbc:mysql://"+sysArea.getAreaDbserve()+":"+sysArea.getAreaPort()+"/"+sysArea.getAreaDatabase());
mp.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
mp.put("hibernate.connection.username", ""+ sysArea.getAreaDbname()+"");
mp.put("hibernate.connection.password", ""+ sysArea.getAreaDbpwd() +"");
mp.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
mp.put("hibernate.show_sql", SHOWSQL);
mp.put("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory");
mp.put("hibernate.query.substitutions", "true=1, false=0");
map.put(unitName, mp);
}
}
return mp;
}

}[/code]

DAOFactory.java 类

[code="java"]public class DAOFactory {

private final Map factory = new HashMap();
private static DAOFactory instance;

public static DAOFactory getInstance(){
if(instance == null){
instance = new DAOFactory();
}
return instance;
}


public UnitDAO getUnitDAO() {
final String key = UnitDAO.class.getSimpleName();
UnitDAO dao = (UnitDAO)factory.get(key);
if (dao == null) {
dao = new UnitDAOImpl();
factory.put(key, dao);
}
return dao;
}
}[/code]

sysArea类

[code="java"]@Entity
@Table(name = "sys_area")
public class SysArea implements java.io.Serializable {

private int areaId;

private String areaNameen;

private String areaDatabase;

private String areaDbname;

private String areaDbpwd;

private String areaDbserve;



public SysArea() {
}



@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = "AREA_ID", unique = true, nullable = false)
public int getAreaId() {
return this.areaId;
}

public void setAreaId(int areaId) {
this.areaId = areaId;
}

@Column(name = "AREA_NAMEEN", nullable = false, length = 16)
public String getAreaNameen() {
return this.areaNameen;
}

public void setAreaNameen(String areaNameen) {
this.areaNameen = areaNameen;
}


@Column(name = "AREA_DATABASE", nullable = false, length = 32)
public String getAreaDatabase() {
return this.areaDatabase;
}

public void setAreaDatabase(String areaDatabase) {
this.areaDatabase = areaDatabase;
}

@Column(name = "AREA_DBNAME", nullable = false, length = 32)
public String getAreaDbname() {
return this.areaDbname;
}

public void setAreaDbname(String areaDbname) {
this.areaDbname = areaDbname;
}

@Column(name = "AREA_DBPWD", nullable = false, length = 64)
public String getAreaDbpwd() {
return this.areaDbpwd;
}

public void setAreaDbpwd(String areaDbpwd) {
this.areaDbpwd = areaDbpwd;
}

@Column(name = "AREA_DBSERVE", nullable = false, length = 256)
public String getAreaDbserve() {
return this.areaDbserve;
}

public void setAreaDbserve(String areaDbserve) {
this.areaDbserve = areaDbserve;
}

}[/code]

SessionFactory 类:


[code="java"]package com.og.cms.dao.impl;

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

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

import com.og.cms.AppConfig;
import com.og.cms.HttpContext;


public class SessionFactory {
private static final Map map = new HashMap();
private static final Map> factory = new HashMap>();
private static final String PUBLICDB = HttpContext.getConfig().getString(AppConfig.PUBLICDB_SUBDIVISION);

static {
EntityManagerFactory emf = map.get(PUBLICDB);
if(emf == null){
emf = Persistence.createEntityManagerFactory(PUBLICDB);
map.put(PUBLICDB, emf);
}
}
private SessionFactory(){

}

public static EntityManagerFactory getFactory(String unitName){
EntityManagerFactory emf = map.get(unitName);
if(emf == null){
Map mp = AreaFactory.getInstance().getAreaMap(unitName);
emf = Persistence.createEntityManagerFactory("hdbms",mp);
map.put(unitName, emf);
}
return emf;
}
public static EntityManager get(final String unitName){
ThreadLocal local = factory.get(unitName);
if(local == null){
local=new ThreadLocal(){
protected synchronized EntityManager initialValue() {
EntityManagerFactory emf = getFactory(unitName);
return emf.createEntityManager();
}
};
factory.put(unitName, local);
}
EntityManager em = local.get();
if(em == null||!em.isOpen()){
em = getFactory(unitName).createEntityManager();
local.set(em);
}
return em;

}

public static void close(final String unitName) throws PersistenceException {
ThreadLocal local = factory.get(unitName);
if(local == null) return;
EntityManager em = local.get();
local.set(null);
if (em != null)
em.close();
}
}
[/code]


基本测试




[code="java"]class testDao {

public List> findAllInfoSoure(String unitName) throws PersistenceException {
List> list = null;
EntityManager em = SessionFactory.get(unitName);
try{
list = em.createQuery("FROM xxx po ORDER BY po.xxDESC").getResultList();
}
catch(PersistenceException ex) {
throw new PersistenceException();
}
finally{
if (em.isOpen()) em.close();
}
return list;
}
}[/code]

其中:unitName 代表是哪个表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值