落叶J空间

常用链接

统计

最新评论

自己遇到的hibernate常见错误

1>

错误显示: net.sf.hibernate.PropertyValueException: not-null property references a null or transient value: com.Order.customer

部分原文件:( customer order 类关系:一对多关联)

Order.hbm.xml

……………

< many-to-one

        name = "customer"

        column = "CUSTOMER_ID"

        class = "com.Customer"

        not-null = "true"

        cascade = "save-update"

     

     />

执行文件:

………

Session session = sessionFactory.openSession();

    Transaction tx = null;

    try {

      // Create some data and persist it

     tx = session.beginTransaction();

 

     Customer customer=new Customer();

     customer.setName("Jack");

    

     Order order=new Order();

     order.setOrderNumber("Jack_Order001");

         session.save(customer);

         session.save(order);

   tx.commit();

原因分析:因为在执行代码中,没有将 customer order 类一对多关联起来,若单独持久化两个类: session.save(customer);session.save(order); 则在保存 order 的时候,由于 CUSTOMER_ID是与 customer类外键,因此无法读取 customer_id, 而在 order.hbm.xml 中指定其不为空,则产生了以上错误。

问题解决: not-null = "true" 改为:not-null="false" 虽然程序无问题,但order表 CUSTOMER_ID为空,不符合逻辑。应该将指定其一对多的关联。

order.setCustomer(customer);

      customer.getOrders().add(order);

 

2〉

错误显示: RROR SessionImpl:2400 - Could not synchronize database state with session

net.sf.hibernate.exception.GenericJDBCException: could not delete collection: [com.Customer.orders#2]

部分原文件:

Session session = sessionFactory.openSession();

    Transaction tx = null;

    try {

      tx = session.beginTransaction();

      Customer customer=(Customer)session.load(Customer.class,new Long(3));

      session.delete(customer);

      tx.commit();

原因分析:因为 cascade默认值为 none,所以当删除customer时,不会自动删除与其关联的order对象。

问题解决:添加语句 cascade = "delete"

 

3>

错误显示:

17:24:34,992 ERROR JDBCExceptionReporter:58 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'ORDER' 附近有语法错误。

17:24:34,992  WARN JDBCExceptionReporter:57 - SQL Error: 156, SQLState: HY000

17:24:35,002 ERROR JDBCExceptionReporter:58 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'ORDER' 附近有语法错误。

17:24:35,022  WARN JDBCExceptionReporter:34 - SQL Warning: 0, SQLState:

net.sf.hibernate.exception.GenericJDBCException : could not initialize collection: [com.Customer.orders#2]

部分原文件: order.hbm.xml

< hibernate-mapping >

  < class name = "com.Order" table = "ORDER" >

     < id name = "id" type = "long" column = "ID" >

        < generator class = "increment" />

      </ id >

   < property name = "orderNumber" type = "string" >

        < column name = "ORDER_NUMBER" length = "15" />

      </ property >

     

      < many-to-one

        name = "customer"

        column = "CUSTOMER_ID"

        class = "com.Customer"

        outer-join = "true"  

       />

原因分析:因为 order 表在 SQL 2000 数据库中已经定义了,如果用户在定义了 order 表,并且程序对该表进行连接等操作就会出错

问题解决:将 引用 order 处改为 [order]

< class name = "com.Order" table = "[ORDER]" >

 

4>

net.sf.hibernate.exception.SQLGrammarException : Could not save object

    at net.sf.hibernate.exception.SQLStateConverter.convert( SQLStateConverter.java:58 )

    at net.sf.hibernate.exception.JDBCExceptionHelper.convert( JDBCExceptionHelper.java:29 )

    at net.sf.hibernate.impl.SessionImpl.convert( SessionImpl.java:4131 )

    at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier( SessionImpl.java:794 )

    at net.sf.hibernate.impl.SessionImpl.save( SessionImpl.java:749 )

    at com.BusinessService.saveCategoryWithCascade( BusinessService.java:54 )

    at com.BusinessService.test( BusinessService.java:104 )

    at com.BusinessService.main( BusinessService.java:109 )

Caused by: java.sql.SQLException : [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'CATEGORIES' 无效。

5〉

错误显示: net.sf.hibernate.MappingException : Resource: Add valid path not found

部分原文件: hibernate.hbm.xml

< hibernate-configuration >

 

< session-factory >

    < property name = "connection.username" > sa </ property >

    < property name = "connection.url" > jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test </ property >

    < property name = "dialect" > net.sf.hibernate.dialect.SQLServerDialect </ property >

    < property name = "myeclipse.connection.profile" > MSSQL </ property >

    < property name = "connection.password" > hheryh </ property >

    < property name = "connection.driver_class" > com.microsoft.jdbc.sqlserver.SQLServerDriver </ property >

    < mapping resource = "Add valid path" />

</ session-factory >

原因分析:找不到有效的 xml 文件

问题解决:将所有配置文件都加到 resource

< mapping resource = "Add valid path" />改为

< mapping resource = "com/Customer.hbm.xml" />

< mapping resource = "com/Order.hbm.xml" />

6〉 错误显示

net.sf.hibernate.MappingException : Error reading resource: com/Customer.hbm.xml

    at net.sf.hibernate.cfg.Configuration.addResource( Configuration.java:340 )

    at net.sf.hibernate.cfg.Configuration.doConfigure( Configuration.java:1027 )

    at net.sf.hibernate.cfg.Configuration.doConfigure( Configuration.java:983 )

    at net.sf.hibernate.cfg.Configuration.configure( Configuration.java:911 )

    at net.sf.hibernate.cfg.Configuration.configure( Configuration.java:897 )

    at com.BusinessService.<clinit>( BusinessService.java:17 )

Caused by: net.sf.hibernate.MappingException : duplicate import: Customer

    at net.sf.hibernate.cfg.Mappings.addImport( Mappings.java:85 )

    at net.sf.hibernate.cfg.Binder.bindClass( Binder.java:126 )

    at net.sf.hibernate.cfg.Binder.bindRootClass( Binder.java:221 )

    at net.sf.hibernate.cfg.Binder.bindRoot( Binder.java:1256 )

    at net.sf.hibernate.cfg.Configuration.add( Configuration.java:253 )

    at net.sf.hibernate.cfg.Configuration.addInputStream( Configuration.java:289 )

    at net.sf.hibernate.cfg.Configuration.addResource( Configuration.java:337 )

    ... 5 more

部分原文件 :hibernate.hbm.xml

<? xml version = '1.0' encoding = 'UTF-8' ?>

<! DOCTYPE hibernate-configuration PUBLIC

          "-//Hibernate/Hibernate Configuration DTD 2.0//EN"

          "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" >

 

<!-- Generated by MyEclipse Hibernate Tools.                   -->

< hibernate-configuration >

 

< session-factory >

    < property name = "connection.username" > sa </ property >

    < property name = "connection.url" > jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test </ property >

    < property name = "dialect" > net.sf.hibernate.dialect.SQLServerDialect </ property >

    < property name = "myeclipse.connection.profile" > MSSQL </ property >

    < property name = "connection.password" > hheryh </ property >

    < property name = "connection.driver_class" > com.microsoft.jdbc.sqlserver.SQLServerDriver </ property >

    < mapping resource = "com/Customer.hbm.xml" />

</ session-factory >

 

</ hibernate-configuration >

 

主程序:

static{

     try{

      // Create a configuration based on the properties file we've put

       Configuration config = new Configuration();

       config.addClass(Customer.class);

      // Get the session factory we can use for persistence

      sessionFactory = config

      .configure()

      .buildSessionFactory();

    }catch(Exception e){e.printStackTrace();}

 

  }

解决方法: config.addClass(Customer.class);
sessionFactory = config.configure().buildSessionFactory();

原因分析: hibernaet 配置文件有两种格式,一种是 xml 格式,一种是普通的 .property 格式 .

1.2 版本中,编译时自动会在 path 路径中查找 property 格式的配置文件。但不会查询 xml 格式的配置文件,因此需要在程序中手动添加 config.configure() ,但此时就不要加载了。

上面的程序 加载了一次 config.configure() ,又映射了一次,所以出错。

 

解决方法:

若配置文件为 xml 格式的,程序编写如下:

// Create a configuration based on the properties file we've put

       Configuration config = new Configuration();

             // Get the session factory we can use for persistence

      sessionFactory = config

      .configure()

.buildSessionFactory();

 

若配置文件为 property 格式的,程序编写如下:

// Create a configuration based on the properties file we've put

       Configuration config = new Configuration();

       config.addClass(Customer.class);

      // Get the session factory we can use for persistence

      sessionFactory = config.buildSessionFactory();

 

posted on 2006-09-07 18:21 黄晖 阅读(2878) 评论(0)  编辑  收藏


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


网站导航: