我正在使用hibernate,因为ORM工具是我的项目。它以前对我来说很好,并且正确地创建了表。我的最后一个表有大约200列,经过一些更改后,我的表需要150列。所以我编辑了我的映射pojo类。已经删除了额外的属性和getter setter来自它Hb2ddl完美地工作正如我可以看到drop table,在我的控制台上创建表语法。但是,hibernate生成的新表包含一些旧的列模式值,这些值未被使用且在映射的pojo中是否存在?
为了在更改pojo名称时进行检查,它会生成150列的rigth表。
为第一个条件添加了图像.mir_ids下面的值来自旧架构。我没有在我的映射pojo中使用它们。
图片1: :
什么时候检查我为pojo尝试一个不同的名字。我得到正确的输出。(那是166行)
图片2::
这些额外的价值不存在并且完美无缺。但我不想这样做。我需要在所有项目中更改表名。
它可能是什么原因?如何纠正?
注意:我编辑了映射的类名,它对我有用。我得到了一个用我需要的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创建了一个额外的表,我没有任何映射。
答案 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。
的章节