我正在开发一个软件,我正在使用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"/>
答案 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;
}