问一个关于hibernate配置问题。

ruir 2006-05-26 11:21:52
一个表的id列在sql server中由java代码写算法维护。在oracle中用sequence自动维护。
这种表的hbm.xml文件的id怎么写???
然后代码中怎么判断处理连接的数据库是sql server还是oracle??
我用hibernate-3.1
...全文
459 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruir 2006-05-30
  • 打赏
  • 举报
回复
up
sole_lodestar 2006-05-29
  • 打赏
  • 举报
回复
以下做法仅供参考(数据同步未考虑)
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--;
}
}
-----------------------------------------------------------------------
ruir 2006-05-29
  • 打赏
  • 举报
回复
同一个表,字段也一样,就是表的id字段在sql server 中是int(非identiey),在oracle是number(使用sequence)
sole_lodestar 2006-05-29
  • 打赏
  • 举报
回复
不同的数据库都是相同的数据表?还是不同的数据表?
water2004 2006-05-28
  • 打赏
  • 举报
回复
安装的时候让用户选择数据库类型,写到属性文件,启系统时根据读出的类型分别用不同的配置文件
aChinese 2006-05-27
  • 打赏
  • 举报
回复
干脆都用java实现,不用序列,不就行了,何苦
ruir 2006-05-27
  • 打赏
  • 举报
回复
系统会发布到很多地方,这些地方有的是oracle的库,有的是sql server的库.这些.hbm.xml文件我想就写一套,不搞两套,实在不行我在程序里判断一下数据库是什么类型,然后做特殊处理.
可是怎么得到hibernate当前连接是什么类型的数据库???
yyjzsl 2006-05-26
  • 打赏
  • 举报
回复
路过,顶下
sole_lodestar 2006-05-26
  • 打赏
  • 举报
回复
你用什么数据库就用哪种写法

更正一下:sqlserver中我写的那个是数据库自动增加的,
不是你 表的id列在sql server中由java代码写算法维护
ruir 2006-05-26
  • 打赏
  • 举报
回复
sql server中不用identiety. 用自己的java算法维护id列。
ruir 2006-05-26
  • 打赏
  • 举报
回复
你是说系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样?
写成两个文件?能否只用一个文件?
sole_lodestar 2006-05-26
  • 打赏
  • 举报
回复
sql server

<id name="id">
<generator class="identity"/>
</id>
sole_lodestar 2006-05-26
  • 打赏
  • 举报
回复
oracle

<id name="DBId" type="java.lang.Integer" column="DBId">
<generator class="sequence">
<param name="sequence">CHANNEL_SEQUENCE</param>
</generator>
</id>
sole_lodestar 2006-05-26
  • 打赏
  • 举报
回复
系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样
----------------------------------------------------------
数据库都不同,影射文件肯定不同

写成两个文件?能否只用一个文件?
----------------------------------
如果你是两套系统用了不同数据库的话,那还是一个系统里只有一种影射文件

对不同数据库而言没有通用的影射文件
sole_lodestar 2006-05-26
  • 打赏
  • 举报
回复
取决于你最终采用的数据库,我想你不可能同时用两个数据库吧?
你用oracle映射文件就只有sequence那个
你用sqlserver的话映射文件就只有你自己写的那个
没有两种映射,除非你是两套系统用不同的数据库

一句话,用oracle就用sequence那个,用sqlserver就用你自己写的那个。不要想着两个都用

ruir 2006-05-26
  • 打赏
  • 举报
回复
你是说系统发布在oracle下和发布在sql server 下此hbm.xml文件不一样?
写成两个文件?能否只用一个文件?
sole_lodestar 2006-05-26
  • 打赏
  • 举报
回复
还有问题?
ruir 2006-05-26
  • 打赏
  • 举报
回复
up

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧