随笔-1  评论-68  文章-98  trackbacks-0

1/ 数据库驱动

   1.1/ Oracle
        jdbc驱动需要注意版本,class111.jar;o_jdbc.jar。
   1.2/ MS SQL Server
        注意版本和网络配置(tcp和管道的权限)。
        官方驱动:2000,3个jar包;2005,一个jar包。
        jrds驱动:评价普遍比官方的好,注意各个版本。
   1.3/ MySQL

2/ 数据库连接/session

   2.1/ hibernate.cfg.xml配置jdbc驱动
   2.2/ hibernate.cfg.xml配置datasource
   2.3/ 在获取session时加载Connection
        struts的datasource
        web server的datasource
        dbcp的datasource

3/ 事务Transaction 与 commit
 
   一次事务只可以提交一次,多次提交会报错。
   javax.servlet.ServletException: JDBC commit failed

4/ 一张表转换成了2个对象,修正为一个对象

   4.1 修改*.hbm.xml,去除composite-id标签,将主键对应的key-property改为id,其它key-property改为property;
   4.2 删除*.java和Abstract*.java,将*Id.java和Abstract*Id.java分别重构为*.java和Abstract*.java;
   4.3 修改*DAO.jar,将findById的参数修正为主键的类型,注意与*.hbm.xml匹配。

修改前:

< hibernate-mapping >
    
< class  name ="com.inc.xschool.entity.PositionInfo"  table ="POSITION_INFO"  schema ="dbo"  catalog ="xschool" >
        
< composite-id  name ="id"  class ="com.inc.xschool.entity.PositionInfoId" >
            
< key-property  name ="positionId"  type ="java.lang.Long" >
                
< column  name ="POSITION_ID"   />
            
</ key-property >
            
< key-property  name ="positionName"  type ="java.lang.String" >
                
< column  name ="POSITION_NAME"  length ="50"   />
            
</ key-property >
            
< key-property  name ="custId"  type ="java.lang.String" >
                
< column  name ="CUST_ID"  length ="50"   />
            
</ key-property >
        
</ composite-id >
    
</ class >
</ hibernate-mapping >

修改后:
<hibernate-mapping>
    
<class name="com.inc.xschool.entity.PositionInfo" table="POSITION_INFO" schema="dbo" catalog="xschool">
        
<id name="positionId" type="java.lang.Long">
            
<column name="POSITION_ID" precision="2" scale="0" />
            
<generator class="assigned"></generator>
        
</id>
        
<property name="positionName" type="java.lang.String">
            
<column name="POSITION_NAME" length="50" />
        
</property>
        
<property name="custId" type="java.lang.String">
            
<column name="CUST_ID" length="50" />
        
</property>
    
</class>
</hibernate-mapping>

5/ 递增字段(整型)
   5.1 Oracle  <generator class="sequence">SEQ_NAME</generator>
   5.2 MySQL  <generator class="increment"/>
   5.3 SQL SERVER <generator class="identity"/>

6/ MS SQL SERVER Exception

6.1 [Microsoft][SQLServer 2000 Driver for JDBC]Underlying input stream returned zero bytes
jdbc bug,text字段的值设为了空或'',改成' '即可,2005中也许修正此bug。

6.2 [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
在手工事务模式 (AutoCommit=false) 下,如果使用直接 (SelectMethod=direct) 模式,当您尝试对使用 JDBC 驱动程序的 SQL Server 数据库执行多个语句时,将会出现此问题。直接模式是该驱动程序的默认模式。
url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor

6.3 [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
    com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败。

客户端:10.170.10.2; WinXP SP2; SQL Server 2000(SP4)
服务端:10.170.10.3; Win2003 Server; SQL Server 2000(SP4)

1/ Microsoft SQL Server 2000 Driver for JDBC(Service Pack 1)
msbase.jar;mssqlserver.jar;msutil.jar

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url  = "jdbc:microsoft:sqlserver://10.170.10.3:1433;DatabaseName=xschool";

java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
 at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
 at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
 at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
 at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
 at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)
 at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)
 at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
 at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
 at java.sql.DriverManager.getConnection(DriverManager.java:512)
 at java.sql.DriverManager.getConnection(DriverManager.java:171)
 at com.inc.xchool.test.TestJDBC.main(TestJDBC.java:31)

2/ Microsoft SQL Server 2005 JDBC Driver
sqljdbc.jar

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
String url  = "jdbc:sqlserver://10.170.10.3:1433;DatabaseName=xschool";

com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败。 java.net.ConnectException: Connection timed out: connect
 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
 at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
 at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
 at java.sql.DriverManager.getConnection(DriverManager.java:512)
 at java.sql.DriverManager.getConnection(DriverManager.java:171)
 at com.inc.xchool.test.TestJDBC.main(TestJDBC.java:34)

3/ Win的数据源(ODBC),系统DSN
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
可以建立连接

解决方法:在10.3的防火墙设置中开通1433的TCP权限。
SQL SERVER TCP 1433

6.4 org.eclipse.core.internal.resources.ResourceException: A resource exists with a different case: /ok/hibernate.reveng.xml.
状况:新建了2个web项目,一个叫ok,一个叫okadmin,都添加了hibernate关联,后者反转数据库结构的时候,eclipse在.log中留下以上的log。
解决方法:临时remove另外一个项目。

6.5 ORA-01461 can bind a LONG value only for insert into a LONG column
状况:JDBC驱动与连接的Oracle数据库版本不一致。
解决方法:置换JDBC驱动为Oracle系统自带的。

posted on 2007-02-08 15:51 Xu Jianxiang 阅读(1793) 评论(1)  编辑  收藏 所属分类: Open Source

评论:
# re: Hibernate FAQ 2009-10-09 10:19 | ajaxor
刚好解决我的问题,谢谢!

可恶的windows防火墙~  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: