上下文
我正在创建一个数据库环境,在该环境中,我希望将数据拆分为几个不同的模式,以便用于不同的用户组。尽管如此,其中一个数据库应该共享给所有人,因为它包含公共实体。
假设数据库:
- DB1-通用实体;
- 车轮实体
- DB2-组"A";
- 汽车实体
- DB3——"B"组;
- 摩托车实体
我有三个不同的项目:
- 项目1:
- 车轮豆
- 项目2:
- 汽车制造商
- 项目3:
- 摩托车制造商
问题
我正在尝试从项目/模式(2,"A")和(3,"B")访问轮子(项目1)
第一个问题:可能吗?第二:我该怎么做?
项目2中的hibernate.cfg.xml
配置为
<property name="hibernate.connection.url">jdbc:mysql://99.999.999.99:3306/DB2</property>
这必然会限制到DB2的所有连接,或者有另一种方法可以添加新的连接或使用3306端口中的所有数据库,或者至少使用DB1?
映射项目2中项目1的实体似乎也没有成功,例如:
<mapping class="com.company.project1.Wheels"
package="com.company.project1.Wheels" resource="com/company/project1/Wheels.hbm.xml"/>
配置
- Eclipse Indigo
- MySql 5.5
- Hibernate 3.0(通过xml而不是注释进行映射)
- 获胜7
感谢您的帮助!
您可以使用@Table(catalog="")
指定它们所属的数据库,然后也可以在数据库之间建立关系。
在您的案例中,Wheel
使用catalog属性映射到DB1,Car
映射到DB2,MotorCycle
映射到DB3。
我已经在MySQL和MSSQL中使用了这个解决方案,并且运行得非常好。这三个数据库的唯一约束必须在同一个数据库服务器中,并且用于访问数据库的用户应该对所有数据库具有适当的权限。
因为这个解决方案只是针对所有查询中的表添加模式名称。
我会将我的项目划分为多个自我维持的项目。Wheel项目将是一个自给自足的项目,负责Wheel实体。
项目1:车轮该项目将定义Hibernate实体和DAO来访问/修改轮子定义。此外,我将在这个项目中配置一个单独的数据源,它指向DB1。实体类:
@Entity
public class Wheel {
}
DAO类:
@Repository
public class WheelDAO {
@Persistence
private EntityManager em;
}
基本上,这个想法是在DAO级别分离应用程序。并在服务级别管理事务。Imaging WheelDAO(连接到DB1数据源)和CarDAO(链接到DB2数据源),并将它们注入CarService。
DB1 DB2 DB2
| | |
WheelDAO CarDAO MotorcycleDAO
_____________/ |
_____|__________________________/
| |
| |
CarService MotorCycleService
我建议使用Spring作为IOC容器来管理这些依赖关系。尽管您也可以在不使用Spring的情况下实现这一点。
您需要的只是一个数据库连接工厂,它允许您在需要时使用所需的数据库。
看看下面的类,你可以调整它来解决你的问题
import java.net.URL;
import java.util.HashMap;
import javax.security.auth.login.Configuration;
public class HibernateUtil {
private static Log log = LogFactory.getLog(HibernateUtil.class);
private static HashMap<String, SessionFactory> sessionFactoryMap = new HashMap<String, SessionFactory>();
public static final ThreadLocal sessionMapsThreadLocal = new ThreadLocal();
public static Session currentSession(String key) throws HibernateException {
HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
if(sessionMaps == null) {
sessionMaps = new HashMap();
sessionMapsThreadLocal.set(sessionMaps);
}
// Open a new Session, if this Thread has none yet
Session s = (Session) sessionMaps.get(key);
if(s == null) {
s = ((SessionFactory) sessionFactoryMap.get(key)).openSession();
sessionMaps.put(key, s);
}
return s;
}
public static Session currentSession() throws HibernateException {
return currentSession("");
}
public static void closeSessions() throws HibernateException {
HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
sessionMapsThreadLocal.set(null);
if(sessionMaps != null) {
for(Session session : sessionMaps.values()) {
if(session.isOpen())
session.close();
}
;
}
}
public static void closeSession() {
HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
sessionMapsThreadLocal.set(null);
if(sessionMaps != null) {
Session session = sessionMaps.get("");
if(session != null && session.isOpen())
session.close();
}
}
public static void buildSessionFactories(HashMap<String, String> configs) {
try {
// Create the SessionFactory
for(String key : configs.keySet()) {
URL url = HibernateUtil.class.getResource(configs.get(key));
SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory();
sessionFactoryMap.put(key, sessionFactory);
}
} catch(Exception ex) {
ex.printStackTrace(System.out);
log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);
} // end of the try - catch block
}
public static void buildSessionFactory(String key, String path) {
try {
// Create the SessionFactory
URL url = HibernateUtil.class.getResource(path);
SessionFactory sessionFactory = new Configuration().configure(url).buildSessionFactory();
sessionFactoryMap.put(key, sessionFactory);
} catch(Throwable ex) {
log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);
} // end of the try - catch block
}
public static void closeSession(String key) {
HashMap<String, Session> sessionMaps = (HashMap<String, Session>) sessionMapsThreadLocal.get();
if(sessionMaps != null) {
Session session = sessionMaps.get(key);
if(session != null && session.isOpen())
session.close();
}
}
} // end of the class
http://www.java-forums.org/