与Hibernate hbm2ddl.auto混淆

时间:2014-09-22 09:33:43

标签: java mysql hibernate java-ee

我正在使用hibernate,因为ORM工具是我的项目。它以前对我来说很好,并且正确地创建了表。我的最后一个表有大约200列,经过一些更改后,我的表需要150列。所以我编辑了我的映射pojo类。已经删除了额外的属性和getter setter来自它Hb2ddl完美地工作正如我可以看到drop table,在我的控制台上创建表语法。但是,hibernate生成的新表包含一些旧的列模式值,这些值未被使用且在映射的pojo中是否存在?

为了在更改pojo名称时进行检查,它会生成150列的rigth表。

为第一个条件添加了图像.mir_ids下面的值来自旧架构。我没有在我的映射pojo中使用它们。

图片1: enter image description here

什么时候检查我为pojo尝试一个不同的名字。我得到正确的输出。(那是166行)

图片2:

enter image description here

这些额外的价值不存在并且完美无缺。但我不想这样做。我需要在所有项目中更改表名。

它可能是什么原因?如何纠正?

注意:我编辑了映射的类名,它对我有用。我得到了一个用我需要的151列创建的新表,但是hibernate仍然创建了那个旧表本身。即使没有映射在hibernate.cfg.xml文件中。

hibernate.cfg.xml文件的代码:

<property name="hibernate.connection.autocommit">false</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
        <property name="hibernate.connection.password">abhijeet</property> <property 
        name="hibernate.connection.url">jdbc:mysql://localhost:3306/jdbctest</property> 
        <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.current_session_context_class">thread</property>
     <property name="hibernate.connection.pool_size">1</property>  
<!--    <property name="hibernate.connection.datasource">jdbc/mysql_pool1</property> --> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">create-drop</property>  
    <mapping class="com.abhijeet.nabi.pojos.TablePojo" />

为什么hibernate创建了一个额外的表,我没有任何映射。

1 个答案:

答案 0 :(得分:1)

我假设通过使用create选项,您可以在进行结构更改时遇到混合表 - 当您更改表的名称时,它会创建一个新的表,并且运行正常。因此,在开发过程中,您应该使用选项create-drop - 这样您确定每次都有一个正确的表。

在集成和课程制作期间,您应该使用validate并单独创建架构。


更新

我认为问题是Hibernate和JPA配置的混合。

您没有指定您使用的Java EE版本,但由于它是Java EE,您可以使用JPA,只要您不使用来自Hibernate的任何专有API ,不需要hibernate.cfg.xml,而只需persistence.xml(见here)。

此外,您不需要列出要映射的所有类,但使用自动检测,因此它会自动使用所有带注释的实体。

您也可以查看Java EE 7 tutorial

的章节