2013-10-23 80 views
0

如果是重複的,我的道歉。我找不到我的問題的答案。如何停止自動計劃創建?

我剛開始Hibernate。每當程序自動刪除舊的shceme並在運行時創建新的程序,我都有一個問題。例如,如果我想將記錄添加到數據庫中,我不能這樣做,因爲該方案將被重新創建,因此歷史記錄將被刪除。

這裏是我的的hbm.xml映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 22-Oct-2013 1:39:31 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="net.ys.hibernate.Equip" table="EQUIP"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="native" /> 
     </id> 
     <property name="dis" type="java.lang.String" column="dis" /> 

     <property name="ref" type="java.lang.String" column="ref" /> 

     <property name="type" type="java.lang.String" column="type" /> 

    </class> 
</hibernate-mapping> 

hibernate.cfg.xml配置文件。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 

     <!-- hibernate dialect --> 

     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">pw</property> 

     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/explorer_DB?useUnicode=true&amp;characterEncoding=GBK</property> 
     <property name="hibernate.connection.username">username</property> 
     <property name="hibernate.default_schema">explorer_DB</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

     <!-- Automatic schema creation(begin) --> 
     <property name="hibernate.hbm2ddl.auto">create</property> 
     <!-- Simple memory-only cache --> 
     <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> 
     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- mapping files with external dependencies --> 
     <mapping resource="net/ys/hibernate/Equip.hbm.xml"/> 


    </session-factory> 
</hibernate-configuration> 

而且addEquip方法:

public Integer addEquip(String dis, String ref, String type){ 
     Session session = sessionFactory.openSession(); 
     currentSession = sessionFactory.getCurrentSession(); 
     Transaction tx = null; 
     Integer equipID = null; 

     try { 
      tx = currentSession.beginTransaction(); //start a transaction 

      Equip equip = new Equip(dis,ref,type); 
      equipID = (Integer)currentSession.save(equip); 
      tx.commit(); 
     } catch (HibernateException e) { 
      if(tx!=null) tx.rollback(); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 

     return equipID; 

    } 
} 

可能有人幫助我解決這個問題呢?我只是不明白如何使用getCurrentSession(),可能我在這一點上是錯誤的。你能解釋當我們爲我調用getCurrentSession()時hibernate是如何工作的嗎?對此,我真的非常感激。

謝謝你這麼多

+0

似乎每一次你創建會話工廠,你可以檢查嗎? – Admit

+0

@Admit嗨Admit,在addEquip()中,首先打開openSession(),並獲取CurrentSession。之後,調用currentSession.beginTransaction()啓動一個事務。但是,更改創建以解決問題。 – Eric

+0

如果你根本不需要模式創建(這相當於沒有值),你也可以刪除它。看看你創建'sessionFactory'的地方,因爲爲每個請求創建新工廠似乎效率不高,並且它似乎是問題的根源。 – Admit

回答

1

更改此屬性在hibernate.cfg.xml文件

當前配置

<property name="hibernate.hbm2ddl.auto">create</property> 

<property name="hibernate.hbm2ddl.auto">none</property> 

如果數據庫的使用要求沒有變化。

<property name="hibernate.hbm2ddl.auto">validate</property> 

更多這個請參考以下鏈接

Hibernate hbm2ddl.auto possible values and what they do?

+0

嗨ByteCode,謝謝,它工作。但是當我第一次沒有這個計劃的時候它不起作用。是否有任何方法可以檢查數據庫,如果我們沒有方案,它會自動創建方案。如果我們有它,那麼添加,刪除或更新,而不會自動創建。 – Eric