首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

对象‘orders’名无效,该如何处理

2012-05-16 
对象‘orders’名无效hibernate-mappingclass namecom.crm.report.entity.Orders tableordersid

对象‘orders’名无效
<hibernate-mapping>
  <class name="com.crm.report.entity.Orders" table="orders">
  <id name="odrId" type="java.lang.Long">
  <column name="odr_id" />
  <generator class="assigned" />
  </id>
  <property name="odrCustomer" type="java.lang.String">
  <column name="odr_customer" length="100" not-null="true" />
  </property>
  <property name="odrDate" type="java.util.Date">
  <column name="odr_date" length="23" not-null="true" />
  </property>
  <property name="odrAddr" type="java.lang.String">
  <column name="odr_addr" length="200" />
  </property>
  <property name="odrStatus" type="java.lang.String">
  <column name="odr_status" length="1" not-null="true" />
  </property>
  <set name="ordersLines" inverse="true" lazy="false">
  <key>
  <column name="odd_order_id" not-null="true" />
  </key>
  <one-to-many class="com.crm.report.entity.OrdersLine" />
  </set>
  </class>
</hibernate-mapping>

为什么老是报这个异常?
2010-04-19 10:19:05,859 ERROR [org.hibernate.util.JDBCExceptionReporter] - 对象名 'orders' 无效。


[解决办法]
数据库里有没有orders这个表?
[解决办法]
你做了映射吗
[解决办法]
<class name="com.crm.report.entity.Orders" table="orders">

把table="orders" 改成table="t_orders"

orders可能跟关键字有关
[解决办法]

探讨

先在是’t_orders‘无效了....

[解决办法]
是不是你orders表不存在啊
[解决办法]
探讨
orders表存在,但是在另一个数据库里面

[解决办法]
http://blog.sina.com.cn/s/blog_4e8d68f9010081r0.html
[解决办法]
你要把database schema 加进去xml, 才能找到那个表
[解决办法]
-.-你想想,要是不用hibernate你用的是JDBC你会怎么去访问orders表?
根本就是两个URL

假设orders表在XE2库中

访问oracle的XE数据库
jdbc:oracle:thin:@localhost:1521:XE

访问oracle的XE2数据库
jdbc:oracle:thin:@localhost:1521:XE2

你觉得用第一个URL获得的connection能找到XE2的orders表么?

[解决办法]
<class name="com.crm.report.entity.Orders" table="dbo.orders">

[解决办法]
帮顶!
[解决办法]
这个怎么帮啊 一一对应呗!
------解决方案--------------------


配置的时候肯定加载的是一个数据库,不同的数据库加载的URL不同,或者驱动不同,肯定找不见了
[解决办法]
数据库没这个表!!!
[解决办法]
在映射文件中设scheme属性指向你的数据库,要指明是用哪个数据库
[解决办法]
<mapping resource="你的 路径/Orders.hbm.xml" />
[解决办法]
在hibernate.cfg.xml中加入
[解决办法]
使用多重配置,比如针对天津和北京,我们分别编写对应的映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.csc.poimanager.dao.Poi" table="POI" id="P_BEIJING" schema="P_BEIJING">
<id name="poiId" type="java.lang.Long">
<column name="POI_ID" precision="10" scale="0" />
<generator class="increment" />
</id>
<property name="cnName" type="java.lang.String">
<column name="CN_NAME" length="1000" />
</property>
</class>
<class name="com.csc.poimanager.dao.Poi" id="P_TIANJIN" table="POI" schema="P_TIANJIN">
<id name="poiId" type="java.lang.Long">
<column name="POI_ID" precision="10" scale="0" />
<generator class="increment" />
</id>
<property name="cnName" type="java.lang.String">
<column name="CN_NAME" length="1000" />
</property>
</class>
</hibernate-mapping>

配置文件除了SCHEMA和ID不同外,其它的完全相同,那么如何使用呢?

sessionFactory.getBean("P"+placeName);

这样就可以实现动态调用了。

至于placeName,可以通过前台调用程序传递过来,也可以放到ThreadLocal里面,后者更具有通用性,而且对以前的程序修改量最少,因为只需要写一个getPlaceName()得方法就行了。

方法3:

修改数据库的连接属性,将以前指向SchemaA的改成指向SchemaB,这需要一些高权限的账号做这些事情。

其实,还有一个更简单的方法,那就是自己继承一个DataSource,然后在方法里面,根据ThreadLocal的参数,返回不同的数据连接。比如如果是BEIGJING,则返回 BeiJingDatasource的连接,如果是TIANJIN,则返回TianJinDatasource的连接。

系统在使用时,肯定会从DataSource里面获取连接,我们在内部做了分配,自然前台运行结果也就分配开了。

提示:在你的DataSource里面可以包含Map<String,DataSource>这样的结构,来做内部的转发。

热点排行