HIBERNATE 3 .0 查询select 视图(含有虚拟列)后 自动 update 如何禁止
环境:
开发环境:Eclipse 3.3.2 MyEclipse 6.0(可能为:Struts 1.2 Spring 2.0 Hibernate 3.0)
WEB服务器:Tomcat 6.0
数据库:Oracle 10g
开发框架:SSH
问题:
1.在数据库建有一张含有虚拟列的视图用于只读查询
select a.METER_GUID,a.CHANGE_NO,a.CUSTOMER_ID,a.CUSTOMER_NAME,a.METER_ID,a.METER_NO,a.BUY_DATE,a.BUY_MONEY,a.AVG_PRICE,a.BUY_ENERGY,
--虚拟列--
(case nvl(a.CLEAR_FLAG,'0')
when '1' then '销帐'
else (case nvl(a.MAKE_CARD_FLAG,'0')
when '2' then '无效'
else '正常'
end)
end) NUM_STATUS_REMARK,
2.Hibernate映射此视图,采用和表一样的映射方式
VStatisticsBuyDetails.hbm.xml
<hibernate-mapping>
<class name="com.wasion.statistics.model.VStatisticsBuyDetails" table="V_STATISTICS_BUY_DETAILS" schema="WASION" >
<composite-id>
<key-property name="meterGuid" type="java.lang.String">
<column name="METER_GUID" length="40" />
</key-property>
<key-property name="buyDate" type="java.util.Date">
<column name="BUY_DATE" length="7" />
</key-property>
</composite-id>
--虚拟列--
<property name="numStatusRemark" type="java.lang.String">
<column name="NUM_STATUS_REMARK" length="4" />
</property>
<property name=" .....
VStatisticsBuyDetails.java
public class VStatisticsBuyDetails implements java.io.Serializable {
private Long customerId;
--虚拟列--
private String numStatusRemark;
private Long changeNo;
private String custGuid;
private String customerNo;
private String customerName;
...
3.在DAOImpl中进行查询,可以返回正常的List
DAOImpl.java
public List getStatisticsBuyDetailsList() {
String queryString;
List list;
try {
queryString = "from VStatisticsBuyDetails ";
list = getHibernateTemplate().find(queryString);
} catch (RuntimeException re) {
throw re;
}
--通过调试变量窗口可以看到已经取到了4个VStatisticsBuyDetails对象--
return list;
}
控制台窗口输出:
Hibernate: select vstatistic0_.METER_GUID as METER1_, vstatistic0_.CHANGE_NO as CHANGE2_, vstatistic0_.METER_ID as METER3_,....
4.在返回到Action的代码前时出现异常:
//在此处调用service 通过service调用DAO
List dataList = service.getStatisticsBuyDetailsList();
//在返回此处前出现异常
String sDataTable = tbService.createDataTable(headArr, bodyArr, dataList);
控制台窗口输出:
Hibernate: update WASION.V_STATISTICS_BUY_DETAILS set NUM_STATUS_REMARK=?, CUSTOMER_NO=?, CUSTOMER_NAME=?, ...
Hibernate: update WASION.V_STATISTICS_BUY_DETAILS set NUM_STATUS_REMARK=?, CUSTOMER_NO=?, CUSTOMER_NAME=?, ...
Hibernate: update WASION.V_STATISTICS_BUY_DETAILS set NUM_STATUS_REMARK=?, CUSTOMER_NO=?, CUSTOMER_NAME=?, ...
Hibernate: update WASION.V_STATISTICS_BUY_DETAILS set NUM_STATUS_REMARK=?, CUSTOMER_NO=?, CUSTOMER_NAME=?, ...
2008-07-31 11:44:45,625 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 1733, SQLState: 42000
2008-07-31 11:44:45,625 ERROR [org.hibernate.util.JDBCExceptionReporter] - ORA-01733: 此处不允许虚拟列
在Hibernate输出调试信息中select语句之后,自动出现了4条(List中返回了4个POJO)update语句,异常抛出在spring或hibernate内部
如何解决?请各位大虾米明示!
1.在slect后我没有更新任何pojo为什么会自动update?
2.请不要建议我去掉视图中虚拟列,否则我就不用提问了!
3.如何使hibernate支持虚拟列?
4.如何在hibernate中设定视图为只读方式?