问一个关于hibernate配置问题。
问一个关于hibernate配置问题。
楼主ruir(瑞儿)2006-05-26 11:21:52 在 Java / 框架、开源 提问 一个表的id列在sql server中由java代码写算法维护。在oracle中用sequence自动维护。
这种表的hbm.xml文件的id怎么写???
然后代码中怎么判断处理连接的数据库是sql server还是oracle??
我用hibernate-3.1 问题点数:100、回复次数:18Top
1 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-26 11:25:44 得分 10
oracle
<id name="DBId" type="java.lang.Integer" column="DBId">
<generator class="sequence">
<param name="sequence">CHANNEL_SEQUENCE</param>
</generator>
</id>Top
2 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-26 11:26:34 得分 0
sql server
<id name="id">
<generator class="identity"/>
</id>Top
3 楼ruir(瑞儿)回复于 2006-05-26 11:27:49 得分 0
你是说系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样?
写成两个文件?能否只用一个文件?Top
4 楼ruir(瑞儿)回复于 2006-05-26 11:28:26 得分 0
sql server中不用identiety. 用自己的java算法维护id列。Top
5 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-26 11:30:06 得分 10
你用什么数据库就用哪种写法
更正一下:sqlserver中我写的那个是数据库自动增加的,
不是你 表的id列在sql server中由java代码写算法维护Top
6 楼yyjzsl(阿木)回复于 2006-05-26 11:30:52 得分 10
路过,顶下Top
7 楼ruir(瑞儿)回复于 2006-05-26 15:15:41 得分 0
upTop
8 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-26 16:31:51 得分 5
还有问题?Top
9 楼ruir(瑞儿)回复于 2006-05-26 17:37:46 得分 0
你是说系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样?
写成两个文件?能否只用一个文件?
Top
10 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-26 17:54:04 得分 10
取决于你最终采用的数据库,我想你不可能同时用两个数据库吧?
你用oracle映射文件就只有sequence那个
你用sqlserver的话映射文件就只有你自己写的那个
没有两种映射,除非你是两套系统用不同的数据库
一句话,用oracle就用sequence那个,用sqlserver就用你自己写的那个。不要想着两个都用
Top
11 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-26 17:56:45 得分 0
系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样
----------------------------------------------------------
数据库都不同,影射文件肯定不同
写成两个文件?能否只用一个文件?
----------------------------------
如果你是两套系统用了不同数据库的话,那还是一个系统里只有一种影射文件
对不同数据库而言没有通用的影射文件Top
12 楼ruir(瑞儿)回复于 2006-05-27 08:23:29 得分 0
系统会发布到很多地方,这些地方有的是oracle的库,有的是sql server的库.这些.hbm.xml文件我想就写一套,不搞两套,实在不行我在程序里判断一下数据库是什么类型,然后做特殊处理.
可是怎么得到hibernate当前连接是什么类型的数据库???Top
13 楼aChinese(一个中国人)回复于 2006-05-27 21:46:58 得分 10
干脆都用java实现,不用序列,不就行了,何苦Top
14 楼water2004(@-@)回复于 2006-05-28 00:57:34 得分 10
安装的时候让用户选择数据库类型,写到属性文件,启系统时根据读出的类型分别用不同的配置文件Top
15 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-29 09:33:48 得分 0
不同的数据库都是相同的数据表?还是不同的数据表?Top
16 楼ruir(瑞儿)回复于 2006-05-29 12:19:49 得分 0
同一个表,字段也一样,就是表的id字段在sql server 中是int(非identiey),在oracle是number(使用sequence)Top
17 楼sole_lodestar(弱势群体应该怎么办)回复于 2006-05-29 12:54:59 得分 35
以下做法仅供参考(数据同步未考虑)
web.xml中
<resource-ref>
<description>user1 datasource</description>
<res-ref-name>jdbc/user</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
<init-param url="jdbc:microsoft:sqlserver://192.168.0.1:1433;DatabaseName=count;SelectMethod=cursor"/>
<init-param user="sa"/>
<init-param password="123456"/>
<init-param max-connections="500"/>
<init-param max-idle-time="30"/>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>user2 datasource</description>
<res-ref-name>jdbc/user</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
<init-param url="jdbc:microsoft:sqlserver://192.168.0.2:1433;DatabaseName=count;SelectMethod=cursor"/>
<init-param user="sa"/>
<init-param password="123456"/>
<init-param max-connections="500"/>
<init-param max-idle-time="30"/>
<res-auth>Container</res-auth>
</resource-ref>
……
-----------------------------------------------------------------------
工厂组类SessionFactoryGroup
/**
* 工厂组
*/
private static HashMap factoryGroup = new HashMap();
/**
* 创建factory, 并存入工厂组
* @param key 键
* @param resource 资源名
* @return
*/
public static SessionFactory buildSessionFactory(String key, String resource) {
SessionFactory factory = SessionFactoryGroup.getSessionFactory(key);
if (factory == null) {
try {
factory = new Configuration()
.configure(resource)
.buildSessionFactory();
factoryGroup.put(key, factory);
}
catch (HibernateException ex) {
throw new RuntimeException("Exception building SessionFactory: " +
ex.getMessage(), ex);
}
}
return factory;
}
/**
* 取得指定的工厂
* @param key 键值
* @return
*/
public static SessionFactory getSessionFactory(String key) {
Object obj = factoryGroup.get(key);
if (obj == null) {
return null;
}
else {
return (SessionFactory) obj;
}
}
/**
* 销毁工厂组
*/
public static void destroySessionFactories() {
Iterator keys = factoryGroup.keySet().iterator();
while (keys.hasNext()) {
Object key = keys.next();
SessionFactory factory = (SessionFactory) factoryGroup.get(key);
try {
factory.close();
factory = null;
}
catch (HibernateException he) {
//
}
factoryGroup.remove(key);
}
}
-----------------------------------------------------------------------
HibernateUtil中
/**
* 当前线程Session
*/
public static final ThreadLocal session = new ThreadLocal();
public static int icount = 0;
public HibernateUtil() throws HibernateException {
}
/**
* 取得并保存当前线程的Hibernate Session
* @param resourceName 标识Resource指向
* @return
* @throws HibernateException
*/
public static Session currentSession(String resourceName) throws
HibernateException {
HashMap h = (HashMap) session.get();
Session s;
if (h != null && h.get(resourceName) != null) {
s = (Session) h.get(resourceName);
//System.out.println("get old one");
}
else {
//closeSession(resourceName);
s = createNewSession(resourceName);
if (null == h) {
h = new HashMap();
}
h.put(resourceName, s);
session.set(h);
//System.out.println("get new one");
}
//System.out.println("current session count:" + icount);
return s;
}
private static Session createNewSession(String resourceName) throws
HibernateException {
icount++;
return SessionFactoryGroup.getSessionFactory(resourceName).openSession();
}
/**
* 关闭当前线程中的hibernate Session
* @throws HibernateException
*/
public static void closeSession(String resourceName) throws
HibernateException {
//System.out.println("close session");
HashMap h = (HashMap) session.get();
if (h != null) {
Session s = (Session) h.get(resourceName);
h.remove(resourceName);
session.set(h);
if (s != null) {
s.disconnect();
s.close();
s = null;
}
icount--;
}
}
-----------------------------------------------------------------------
Top
18 楼ruir(瑞儿)回复于 2006-05-30 20:50:35 得分 0
upTop
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn
