使用hibernate的id自动生成策略问题

       用hibernate都有一段时间了,用hibernate生成数据库对于hibernate来说算了基本要做的事情了。这样做也更能体现面向对象的思想.....  

       今天依然用了hibernate,不过跟完成不一样的是不是通过hibernate生成数据库,而是事先建立数据库,然后通过反向工程来生成hibernate配置文件。而且并没有考虑这样做跟用hibernate生成数据库有何不同。也正是因为这样,才导致了今天的问题出现了。

      数据库id设置为主键,并没有设置自动增长。当时的想法只是想让hibernate管理。hibernate也并没有负我所托,生成的hibernate配置文件id的生成策略为native(即hibernate根据数据库的类型决定使用那种策略,如果是DB2、MySQL、Sybase、MS SQL数据库则使用identity策略,如果是oracle则使用sequence策略),不过问题出现了,当我使用hibernate的save方法时,抛出id 为null的异常

org.hibernate.AssertionFailure: null id in com.hxw.card.entity.OrderPayOil entry (don't flush the Session after an exception occurs) org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:78) org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:187) org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143) org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219) org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99) org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49) org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655) org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732) org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701) org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) $Proxy20.save(Unknown Source) com.hxw.card.action.OrderPayOilAction.orderPay(OrderPayOilAction.java:40) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597)

       但是出现这个问题我怎么想都想不通,明明是已经设置为native啊,为什么还没用。于是乎跑到数据库里面设置id为自动加1。虽然也得以解决,但总是感觉很别扭,后来网上找了下资料,问了下大牛们,才发现是因为我使用的是数据库生成hibernate配置文件而不是hibernate生成数据库的。问题也就出现在这里,前者hibernate会把生成策略抛给数据库管理,而后者者会自己处理!!!!

       希望大家不要犯和我一样的错误!终究原因还是对hibernate不熟悉啊.....

你可能感兴趣的:(Hibernate,数据库,exception,session,null,Sybase)