java - Hibernate/Spring HibernateTemplate.findByCriteria(Deatched Criteria dc) 在 View 上执行sql更新

标签 java hibernate

我正在尝试根据给定条件搜索 View 。此 View 有几个字段用于我的应用程序中用户可能想要搜索的多个不同实体。

当我输入要搜索的实体的名称时,我在调用 .findByCriteria() 之前将名称字段的限制添加到分离条件。这会导致 .findByCriteria() 检索包含我要查找的名称的结果列表。

此外,当我查看我的日志时,我可以看到 hibernate 调用了一个 select 语句。

我现在已经在我的 View 中添加了另一个实体,其中包含一些可搜索的字段。当我尝试搜索与这个新实体相关的字段时,我在日志中遇到异常。

当我查看异常日志时,我可以看到 hibernate 在 select 之后调用 select 语句和 update 语句(我不是要更新记录,只是在列表中检索它)。

那么为什么当我为我的新实体调用 .findByCriteria() 时 hibernate 调用更新?

    
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)

SQL that is executed:

Hibernate:

    select
    * 
from
    ( select
        this_.SEARCH_ID as SEARCH1_35_0_,
        this_.ST_NM as ST24_35_0_ 
    from
        SEARCH_RESULT this_ 
    where
        this_.LOAN_TYPE=? ) 
where
    rownum <= ?
DEBUG 2012-03-21 11:37:19,332 142195  (http-8181-3:org.springframework.orm.hibernate3.HibernateTemplate):
      [org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:389)] 
      Eagerly flushing Hibernate session

DEBUG 2012-03-21 11:37:19,384 142247  (http-8181-3:org.hibernate.SQL):
      [org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111)] 
update
    SEARCH_RESULT 
set
    ADDR_LINE1=?,
    ASSGND_REGION=?,
    BASE_DEAL_ID=?,
    ST_NM=? 
where
    SEARCH_ID=?

最佳答案

可能会发生更新,因为 Hibernate 被设置为在执行查询之前执行自动刷新,所以如果持久化上下文认为它有脏数据,它将尝试更新它。没有看到代码我不能确定,但​​我猜即使 search_result 是一个 View ,你相应的 Java 对象在 getters 上被注释并且对象有匹配的 setters。 Hibernate 不区分表和 View ,如果您调用 setter,Hibernate 将假定它有数据更改要更新。

您可以通过添加 @Immutable 注释(或 hibernate.@Entity(mutable = false) 来调整为 View 构建 Java 对象的方式,具体取决于您使用的版本。这应该足以向 Hibernate 表明不要刷新更改。您还可以直接注释字段并摆脱 setter ,以便 SearchResult 对象的使用者知道它是只读的。

关于java - Hibernate/Spring HibernateTemplate.findByCriteria(Deatched Criteria dc) 在 View 上执行sql更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807479/

相关文章:

Java Spring Data 指定模式

c# - NHibernate SchemaExport 不创建表

java - 如何使用 Hibernate Validator 动态解析消息参数?

java - 陷入 Spring 性能问题

java - 线程 "AWT-EventQueue-0"java.lang.NullPointerException 中的异常? java

java - 如何在 Java 中用前导零对数字进行排序?

java - 尝试为两个字符串列表获取随机数

java - JPQL : unknown state or association field (EclipseLink)

java - 如何使用 Hibernate 设置默认实体属性值

java - Hibernate 中缓存并发性中的只读与非限制读写