使用Hibernate实现ORM
映射文件如下:<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="test_hibernate.user" table="user">        <id name="id" column="id" type="int">        </id>        <property name="name" column="name" type="string" not-null="true"/>
        <property name="age" column="age" type="int" not-null="true"/>    </class></hibernate-mapping>

解决方案 »

  1.   

    properties文件如下:hibernate.dialect=org.hibernate.dialect.SQLServerDialect
    hibernate.connection.driver_class=com.microsoft.jdbc.sqlserver.SQLServerDriver
    hibernate.connection.url=jdbc:microsoft:sqlserver://xxx.xxx.xx.xx:1433;DatabaseName=test
    hibernate.connection.username=sa
    hibernate.connection.password=
    hibernate.show_sql=true程序文件如下:import org.hibernate.*;
    import org.hibernate.cfg.*;
    import javax.servlet.*;
    import java.io.*;
    import java.util.*;public class userService{
      public static SessionFactory sessionFactory;
      static{
        try{
          // Create a configuration based on the properties file we've put
          // in the standard place.
          Configuration config = new Configuration();
          config.addClass(user.class);
          // Get the session factory we can use for persistence
          sessionFactory = config.buildSessionFactory();
          System.out.println("in the static place!");
        }catch(Exception e){e.printStackTrace();}
      }public boolean saveUser(user user) throws Exception{
            
      Session session = sessionFactory.openSession();
      Transaction tx = null;
      try {   
        tx = session.beginTransaction();   
        session.save(user);    
        tx.commit();    
      }catch (Exception e) {
        if (tx != null) {      
          tx.rollback();
          return false;
        }
        throw e;
      } finally {    
        session.close();
      }
      return true;
    }
    }
      

  2.   

    但是运行时出现如下错误:Hibernate: insert into user (name, age, id) values (?, ?, ?)17:29:06,921  WARN JDBCExceptionReporter:71 - SQL Error: 156, SQLState: HY00017:29:06,921 ERROR JDBCExceptionReporter:72 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'user' 附近有语法错误。17:29:06,937 ERROR AbstractFlushingEventListener:299 - Could not synchronize database state with sessionorg.hibernate.exception.GenericJDBCException: could not insert: [test_hibernate.user] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:91) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:79) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2077) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2426) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:877) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:345) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at test_hibernate.userService.saveUser(userService.java:59) at test_hibernate.first.doGet(first.java:25) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125) at java.lang.Thread.run(Thread.java:534)Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'user' 附近有语法错误。 at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source) at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRPCRequest.processReplyToken(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source) at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source) at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown Source) at com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source) at com.microsoft.jdbc.base.BasePreparedStatement.postImplExecute(Unknown Source) at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source) at com.microsoft.jdbc.base.BaseStatement.executeUpdateInternal(Unknown Source) at com.microsoft.jdbc.base.BasePreparedStatement.executeUpdate(Unknown Source) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2061) ... 42 more17:29:06,984  WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState: 17:29:07,000  WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC]Database changed to test17:29:07,000  WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState: 17:29:07,015  WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]已将数据库上下文改为 'test'。17:29:07,015  WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState: 17:29:07,015  WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC]Language changed to 简体中文17:29:07,015  WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState: 17:29:07,031  WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]已将语言设置改为 简体中文。由于偶是新手,请大虾给予指正!谢谢!
      

  3.   

    user是关键字,改成其他的比如 tb_user
      

  4.   

    看你的意思,好像id是数据库自动生成的主键,写法应该这样:
        <id name="id" column="id" type="long">
          <generator class="identity"/>
        </id>还有,楼主的类名最好用大写字母开头,对象名最好不要和类名一样,很难维护而且容易出错
    建议,还有user可以用,不是关键字,我用过的
      

  5.   

    我的id字段确实是主键,但是class中的id元素的generator元素不是必须的,所以这里没有用自动构造标识符的方法。
    问题已经解决,正如wengzuliang(Jeff)所说的那样,user是sql server的关键字。谢谢!
    同时,感谢yinleiyoung(星际孤虹)关于代码规范的建议!