我正在使用hibernate,每当我尝试添加记录时,它都会丢弃表并再次添加它。它从不使用现有的表并对其进行更改。
这是我hibernate.cfg.xml
的相关部分:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.DerbyDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name = "current_session_context_class">thread</property>
<!-- Mapping the entities -->
<mapping class="inputDetails.Table1"/>
<mapping class="inputDetails.Table2"/>
<!--mapping resource="contact.hbm.xml"/-->
</session-factory>
</hibernate-configuration>
这是我保存数据的方式:
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
//...
session.save(newrecord)
session.getTransaction().commit();
答案 0 :(得分:18)
<property name="hibernate.hbm2ddl.auto">update</property>
每次创建会话工厂时,都会告诉hibernate更新数据库模式。
并且
SessionFactory factory = new Configuration().configure().buildSessionFactory();
建立一个新的会话工厂。
在应用程序生命周期内,SessionFactory
只应构建一次。它应该创建一次然后重用。您是否阅读过hibernate reference manual?
答案 1 :(得分:1)
你确定它被覆盖了还是没有提交?我的意思是你提交你的交易吗?
也许尝试以下几行:
try {
factory.getCurrentSession().beginTransaction();
// Do some work
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
factory.getCurrentSession().getTransaction().rollback();
throw e; // or display error message
}
答案 2 :(得分:1)
希望这可以帮到你
AnnotationConfiguration config = new AnnotationConfiguration();
config.addAnnotatedClass(Employee.class);
config.configure("hibernate.cfg.xml");
new SchemaExport(config).drop(false, false);
答案 3 :(得分:1)
我有
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.hbm2ddl.import_files" value="META-INF/import.sql" />
我第一次部署。这创建了我想要的架构并用数据填充它。我第二次换到
<property name="hibernate.hbm2ddl.auto" value="update" />
并重新部署。表格显然已被删除。我在第一次部署时切换到create
并继续使用update
进行重新部署。这个时间表没有被删除,数据保持不变。
答案 4 :(得分:0)
如果您使用注释,请尝试以下操作:
Properties hibernateProperties = new Properties();
// your props ...
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");
// or use Environment.HBM2DDL_AUTO from org.hibernate.cfg.Environment
hibernateProperties.setProperty(Environment.HBM2DDL_AUTO, "update");