使用Hibernate自动生成表不能正确创建表的问题

时间:2021-08-10 11:59:39

 

 

          今天做项目的时候使用的是  实体--> 数据库表  的映射采用Hibernate自动生成表结构,控制台打印的见表语句都是正确的额。但是在数据库中有部分表找不到。最后发现是因为数据库表的字段和数据库中的关键字冲突,所以在映射文件配置的时候对某些特殊的字段加个column字段来进行区分。问题得到解决。

        <property name="content" column="contents"/>
        <property name="sendTime" type="timestamp"/>
        <property name="read" column="isread"/>

 

 

 

还有,下面看到的一个问题也需要注意。开始以为是这个问题所致,结果是因为字段名字的问题:

像下面这种问题如果使用的是SQL Server 数据库,可以这样配置解决:

<property name="default_catalog">dbo</property>

 

 

最近在项目中使用hibernate的动态生成表,即将hbm2ddl.auto配置成update时,发现hibernate并没有按照默认的生成规则生成相应的数据表信息。但奇怪的是,只是部分表没有生成,而其它的表即生成成功了。重新启动项目,发现问题依旧。奇怪的是,虽然有些表没有生成,但它相关联的关联表即生成了,而且在生成时,会报一个找不到相关的引用表的错误。报的错误如下:

 


1
2 =2011-05-06 09:45:56 [org.hibernate.tool.hbm2ddl.SchemaUpdate]-[ERROR] Unsuccessful: alter table r_role_x_menu add constraint FK474DC862E1A553E2 foreign key (menu_id) references p_menu
=2011-05-06 09:45:56 [org.hibernate.tool.hbm2ddl.SchemaUpdate]-[ERROR] ORA-00942: 表或视图不存在

    找了半天,最后发现一个问题,即这里需要引用的表p_menu在另一个用户空间里已经存在了,而hibernate在创建表时,在另一个用户空间中找到了这个表,故不再在当前的用户空间中创建这个表了。而在创建关联表时,由于关联的是本用户空间的表,故有此错误。
    hibernate使用了jdbc默认的databasemeta来寻找相应表数据信息,当使用默认的配置时,由于某种原因(并不是每次都能发生,取决于数据库本身以及相应的驱动)。当使用当前用户连接到数据库时,使用databasemeta寻找数据库表信息时,会查询出其它用户的数据表信息(即使当前用户没有相应的权限)。
    解决此问题的方法很简单,只需要在hibernate.cfg.xml中配置一句:

1 <property name="default_schema">当前连接用户</property>

   这样,使用databasemeta时,就会强制性地在当前用户空间中寻找数据库信息了,这样就能正确的创建出表结构了。