ORA-22920:包含LOB值的行未使用JSF锁定

时间:2013-12-03 09:33:49

标签: java oracle hibernate jsf primefaces

我正在开发一个软件,我正在使用jsf,primefaces和oracle数据库,当我想保存或加载或显示一个包含clob的表的记录时我得到了“ORA-22920:包含LOB值的行是没有锁定“。我到处搜索,但我找不到任何解决方案。我的代码是这样的。

Model.java

private Clob sut;

    try {
                if( sut != null )
                {
                    return sut.getSubString(1,(int) sut.length());
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return "";
        }
        public void setSutString(String str)
        {
            try {
                sut.setString(1, str);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        public Clob getSut() {
            return sut;
        }

        public void setSut(Clob sut) {
            this.sut = sut;
        }

Hibernate文件

<property name="sut" type="java.sql.Clob" update="true" insert="true" >
        <column name="SUT" />
    </property>

XHtml文件

 <h:outputLabel for="short_description10" value="#{languageBean.getValue('SUT')}" /> 
                    <p:inputTextarea id ="short_description10" value="#{recordBean.selectedRecord.sutString}" 
                    rows="5" cols="30" autoResize="false" disabled="#{recordBean.editableFieldRecord}" style="width: 490px"/>

1 个答案:

答案 0 :(得分:2)

我曾经遇到过同样的问题,你是在正确的道路上,但是你需要注意以下问题:

当clob的“setString”时,它连接到数据库,并尝试更新相关行的字段,而没有锁定。您将尝试开始一个事务并通过UPGRADE标志锁定相关行,然后提交,或者您将遵循一个非常简单的方法,这是我解决问题的方法,

当读取clob的字符串值时,将使用您的方法,但是当您写入clob时,使用更新的值创建一个新的clob对象并将其分配给clob对象。这将强制更新clob字段以与对象本身一起更新,其中hibernate将负责锁定当前行。就是这样!

        private Clob sut;

        try {
            if( sut != null )
            {
                return sut.getSubString(1,(int) sut.length());
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }
    public void setSutString(String str)
    {
        Clob newValue = new ClobImpl(str);
    this.setSut( newValue );
    }

    public Clob getSut() {
        return sut;
    }

    public void setSut(Clob sut) {
        this.sut = sut;
    }