项目中需要多个数据库,而且每个数据库的基本信息都是保存在一个公共库(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 代表是哪个表
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 代表是哪个表