加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Hibernate 映射 schema简析(异常:Missing column)

(2012-09-14 11:17:45)
标签:

hibernate

schema

missingcolumn

it

分类: J2EE
     在hibernate中配置hbm映射文件,mysql数据库正常使用,换成Oracle后报错:“ org.hibernate.HibernateException:Missing column”!
原因是映射的时候没有设置:schema="用户名"属性!在oracle中根据用户来指定!
    引用:“Oracle schema可视为同一个使用者所拥有的所有数据库对象(schema objects)之集合。举例来说,使用者scott所建立的EMP table其完整名称为SCOTT.EMP,而SCOTT就是EMP的schema名称。所以schema name其实就是一个Oracle数据库之使用者帐号,Oracle的schema objects只存在于tablespace中。
我的项目中,引起错误的原因是:oracle创建用户时,授权给用户dba导致用户可以访问所有的其它用户的表,而另外一个用户恰好拥有相同的表,导致访问错误。解决的办法就是只授权给用户connect和resource的权限。

    简析:

Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate schema,包括介绍切换Schema等方面。

Hibernate schema

如果你在调用Hibernate的时候需要切换schema怎么办呢。

在oracle中,不同的用户,使用不同的schema.在Hibernate的POJO中,会指定了schema

 

<?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" 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> 

</hibernate-mapping> 

上面的代码部分,就指定了Schema.如果在操作的时候想切换Schema.操作如下:

默认的配置<property name="hibernate.default_schema">POI_BEIJING</property>

上面的映射文件改为:

<?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 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> 

在操作的,可以用下面的方法来重新build你的SessionFactory

public static void rebuildSessionFactoryForChangeSchema(String newSchema){  

try {  

Properties p = configuration.getProperties();  

System.out.println("---" + p);  

p.put("hibernate.default_schema", newSchema);  

sessionFactory = configuration.buildSessionFactory();  

System.out.println(" change schema successfully ......... ");  

} catch (Exception e) {  

System.err  

.println("%%%% rebuild session factory failed for changing schema %%%%");  

e.printStackTrace();  

}  

如果需要改变Schema,就需要在需要的时候调用此方法。

比如在SchemaAction中

HibernateSessionFactory.rebuildSessionFactoryForChangeSchema("POI_SHANGHAI");  

System.out.println(" change successfully---");  

PoiDAO pd = new PoiDAO();  

Transaction t =pd.getSession().beginTransaction();  

pd.save(new Poi("jsfjksdf"));  

t.commit(); 

那么,原来,是向POI_BEIJING中插入数据的,变成了向POI_SHANGHAI中插入一条数据了。通过这种方法,可以实现在操作不同的Schema的时候实现切换。


问题:此处改变的是静态工厂。所以,会对所有的用户产生影响。如果不想对所有的用户改变,那么可以根据Schema的名称来取得自己对应的SessionFactoy就可以了。以上介绍Hibernate schema。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有