Hibernate常见异常(整理ing)

来源:互联网 发布:ssh oracle项目源码 编辑:程序博客网 时间:2024/06/05 17:02
 

Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

不注意的话,还真的有点无所适从,Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1这个异常是由于主键设置为自增长,而在我们插入记录的时候设置了ID的值导致的。

java.lang.NoClassDefFoundError: antlr/ANTLRException


开始没有注意到这个,只看下面的详细情况.结果调试了两天还是不行.没办法,搜索了一下antlr/ANTLRException,结果发现是少了antlr-2.7.5H3.jar包

 

使用Hibernate3.2 以上版本的注解映射,需导入以下jar包: 织梦好,好织梦
1. ejb3-persistence.jar
2. hibernate-annotations.jar
3. hibernate-commons-annotations.jar
4. hibernate-core.jar
如果和Spring 整合,那么需要另外导入一个jar包(spring.jar)。
注意:
此spring.jar必须是 Spring2.5以上版本的,因为,Spring2.5之前org.springframework.orm.hibernate3.LocalSessionFactoryBean类中,并没有 packageToScan 这个属性,只有mappingResuorces这个属性。而packageToScan这个属性正是映射包中的类,而mappingResuorces只是映射某个文件。

com.test.po
这样,即可完成映射。

在使用 Hiberante注解映射和Spring整合过程中可能遇到的异常:
如出现java.lang.NoClassDefFoundError: org/dom4j/ ,导入dom4j.jar包即可
如出现java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory , 需要导入以下四个jar包(1: slf4j-api-1.4.3.jar、2:slf4j-jdk14-1.4.3.jar、3:slf4j-log4j12-1.4.3.jar、4:log4j-over-slf4j-1.4.3.jar) 即可
如出现java.lang.NoClassDefFoundError: javax/transaction/TransactionManager , 需要导入 jta.jar包
java.lang.ClassNotFoundException: antlr.ANTLRException 则需要导入ant.jar包
org.springframework.util.Assert.noNullElements([Ljava/lang/Object;Ljava/lang/String;)V Invalid property 'packagesToScan' of bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: Bean property 'packagesToScan' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 这是由于,spring.jar包的版本不符,把spring.jar换成Spring 2.5以上版本即可
6. java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V jar包冲突,删除asm-2.2.3.jar 即可

 

ids for this class must be manually assigned before calling save()

oracle:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "ID", unique = true, nullable = false, length = 50)
public String getId() {
    return this.id;
}

id最好是自动生成:
如果是配置Hbm文件,可以加入<generator class="assigned"></generator>
如果是注解:@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}


 hibernate   +MySQL 5中,出现错误提示:
Field 'id' doesn't have a default value
解决方法
打开my.ini(my-template.ini),查找
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
修改为
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Spring与Hibernate整合getHibernateTemplate().delete(object)删除不了数据


Spring 还是没有封装 Hibernate 的删除、插入时事物的开启 和提交..
找了资料我去hibernate.cfg.xml 添加了一句
<property name="connection.autocommit">true</property>

 

Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition 错误解决

错误代码:
  org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode(FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove'readOnly' marker from transaction definition
错误原因:
  OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再接除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
参考文章:
  http://calvin.blog.javascud.org/post/46.htm
解决办法:
  采用spring的事务声明,使方法受transaction控制
<bean id="baseTransaction"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="proxyTargetClass" value="true"/>
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="add*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean> 
    <bean id="userService" parent="baseTransaction">
        <property name="target">
            <bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
        </property>
    </bean>