对象‘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可能跟关键字有关
[解决办法]
[解决办法]是不是你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>这样的结构,来做内部的转发。