2011-07-07 12 views
6

私はhibernateを使用しています。レコードを追加しようとすると、テーブルが削除されて再び追加されます。それは決して既存のテーブルを使用してそれを変更します。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(); 

答えて

16
<property name="hibernate.hbm2ddl.auto">update</property> 

データベーススキーマにセッションファクトリが作成されるたびに更新するために、休止状態に伝えます。

そして

SessionFactory factory = new Configuration().configure().buildSessionFactory(); 

は、新しいセッションファクトリを構築します。

SessionFactoryは、ウォールアプリケーションの有効期間中に1回のみ作成する必要があります。これは一度作成してから再利用する必要があります。 hibernate reference manualを読んだことがありますか?これはあなたに

AnnotationConfiguration config = new AnnotationConfiguration(); 

config.addAnnotatedClass(Employee.class); 
config.configure("hibernate.cfg.xml"); 
new SchemaExport(config).drop(false, false); 
+1

セッションに既存のデータベースの内容を読み込ませる方法はありますか?アプリケーションの実行が停止した後にデータベースに値があり、アプリケーションを再起動すると、データベースに既にあるものの上にレコードを追加することができます。 – Sujen

+1

私の答えをもう一度読んで、リファレンスマニュアルを読んでください。 hibernate.hbm2ddl.auto = autoを使用すると、セッションファクトリを作成するたびにスキーマを更新するようにhibernateに指示します。それでテーブルを作り直します。これは、空のデータベースを使用した迅速なテストに役立ちます。保存したいデータがある場合は、スキーマを手動で変更し、この設定オプションを設定ファイルから削除してください。 –

+0

オハイオ州大丈夫、私は財産がデータベースからコンテンツを再作成する代わりに(私がどこか他の場所から読んだもので、私が思ったものの反対であると思われる)内容を保持するために使用されていると思ったので混乱しました。ありがとう、私はチャンスを得るときあなたのソリューションを試してみます。 – Sujen

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 
} 
+0

私はトランザクションをコミットしました。私は私のポストにそれを置くことを忘れた。私は今それを編集しました。 – Sujen

1

希望は私が

<property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
<property name="hibernate.hbm2ddl.import_files" value="META-INF/import.sql" /> 

私が最初に展開時間を過ごしました。これにより、目的のスキーマが作成され、データが移入されます。 2回目に私は

に変更しました
<property name="hibernate.hbm2ddl.auto" value="update" /> 

そして再展開しました。明らかにテーブルは落とされました。最初の展開ではcreateに切り替え、再デプロイメントではupdateのままでした。この時間表は削除されず、データは変更されませんでした。

0

を助けることができる

関連する問題