我正在创建一个数据库环境,我想在几个不同的模式中拆分数据,以便用于不同的用户组。虽然,由于它包含共同实体,因此应该向每个人共享其中一个数据库。
假设数据库:
我有三个不同的项目:
我正在尝试从项目/模式(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中的project1 映射实体似乎也不会成功,例如:
<mapping class="com.company.project1.Wheels"
package="com.company.project1.Wheels" resource="com/company/project1/Wheels.hbm.xml"/>
感谢您的帮助!
答案 0 :(得分:4)
您可以使用@Table(catalog="")
指定它们所属的数据库,然后还可以跨数据库建立关系。
在您的情况下Wheel
使用catalog属性映射到DB1,Car
映射到DB2和MotorCycle
到DB3。
我已经使用MySQL和MSSQL的这个解决方案,并且工作得非常好。只有约束这三个数据库必须在同一个数据库服务器中,用于访问数据库的用户应该拥有对所有数据库的适当权限。
因为此解决方案只是在所有查询中针对表添加模式名称。
答案 1 :(得分:1)
我会将我的项目分成多个自我维持的项目。 Wheel项目将是一个自给自足的项目,负责Wheel实体。
项目1:轮子 该项目将定义Hibernate实体和DAO以访问/修改轮定义。 此外,我将在此项目中配置一个指向DB1的单独数据源。 实体类:
@Entity
public class Wheel {
}
DAO课程:
@Repository
public class WheelDAO {
@Persistence
private EntityManager em;
}
基本上,我们的想法是在DAO级别分离应用程序。并在服务级别管理交易。成像WheelDAO(连接到DB1数据源)和CarDAO(连接到DB2数据源)并将它们注入CarService。
DB1 DB2 DB2
| | |
WheelDAO CarDAO MotorcycleDAO
\_____________/ |
\_____|__________________________/
| |
| |
CarService MotorCycleService
我建议使用Spring作为IOC容器来管理这些依赖项。虽然你也可以不使用Spring来实现这一点。
答案 2 :(得分:1)
您需要的只是一个数据库连接工厂,它允许您在需要时使用所需的数据库。
请查看下面的课程,您可以根据该课程来解决问题
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