1

私のアプリケーションでは、SpringコンテキストとJPAを使用しています。注釈が付けられたエンティティのセットがいくつかあり@Entity、それらのテーブルはシステムの起動時に自動的に作成されます。最近、Spring ACLを使い始めたので、次の追加のDBスキーマが必要であり、これらのテーブルをエンティティにマップしたくありません(Spring ACLはそれらを独立して管理するため、単にマップする必要はありません)。

  1. Userたとえば、adminユーザーアカウントをのエンティティテーブルに自動的に挿入したいと思い ます。それを正しく行う方法は?
  2. システムの起動時にSpringACLカスタムテーブルを初期化したいのですが、SQLスクリプトファイルは適切な解決策ではないようです。本番テストと機能テストに異なるデータベースを使用すると、SQLダイアレクトが異なるため、両方でスクリプトを正しく実行できないためです。エンジン(たとえば、MySQLおよびHSQLを使用する場合)。

最初はServletListener、サーブレットの初期化中にデータベースをチェックして必要なデータとスキーマを追加しようとしましたが、統合テストでは機能しません(サーブレットがまったく関与していないため)。

私が達成したいのは、JPAがすべてのエンティティテーブルを初期化し、挿入されたDAOを使用してすべてのスタートアップデータを挿入し、何らかの方法でSpringACLスキーマを作成した後に起動されるSpringBean(?)です。次に、BeanをIoCから削除したい(私はもはやそれを必要としないため)。出来ますか?

または、これを行うためのより良い方法はありますか?

4

5 に答える 5

2

デフォルトの JPA では、persistence.xml のロード時に SQL スクリプトを追加できます。

http://docs.oracle.com/javaee/7/tutorial/persistence-intro005.htm

次のプロパティを persistence.xml ファイルに追加します。

   <property name="javax.persistence.sql-load-script-source"
              value="META-INF/sql/data.sql" />

そして、data.sql ファイルにデフォルト値を入力します。

于 2016-04-11T09:08:28.200 に答える
1

PostConstructアノテーションを使用して初期化メソッドを呼び出します。

ドキュメントの説明: PostConstruct アノテーションは、初期化を実行するために依存性注入が行われた後に実行する必要があるメソッドで使用されます。 @PostConstruct アノテーションを持つメソッドを含むスプリング ビンを追加するだけで、テーブルが作成された後にメソッドが実行されます (または、他の Bean の準備が整った後に実行されると言えます)。

コードサンプル:

@Component
public class EntityLoader {

    @Autowired
    UserRepository userRepo;

    @PostConstruct
    public void initApiUserData() {
        User u = new User();
        // set user properties here
        userRepo.save(u);
    }

}
于 2015-04-20T04:57:55.550 に答える
1

EclipseLink を使用している場合は、SessionEventListener を使用して、JPA ログイン後にコードを実行できます。postLogin イベントでスキーマの作成とセットアップを実行できます。

EclipseLink の Schema Framework (org.eclipse.persistence.tools.schemaframework) を使用して、データベース プラットフォームに依存しない方法でテーブルと DDL を作成できます。(TableDefinition、SchemaManager クラス)

于 2013-01-15T14:20:42.597 に答える
0

フライウェイを使用して試すことができます

  • SQL DDL を SQL 移行として使用してテーブルを作成し、
  • SQL または Java ベースの移行を使用してテーブルにデータを配置する可能性があります。環境やその他の情報が必要な場合は、後者を使用することをお勧めします。

思ったよりずっと簡単で、必須ではないにしても、ボーナスとしてフライウェイ自体を手に入れることになります。

于 2013-12-09T04:19:53.397 に答える
0

hibernate を使用する場合import.sqlは、クラス パス ルートに SQL スクリプトを作成します。Hibernat は起動時にそれを実行します。-- これは、以前の休止状態のバージョンで機能しました。現在のバージョン 4.1 のドキュメントでは、この機能に関するヒントは見つかりませんでした。

しかし、Hibernate 4.1 には別の機能があります。

財産:hibernate.hbm2ddl.import_files

SessionFactory の作成中に実行される SQL DML ステートメントを含むオプション ファイルのカンマ区切りの名前。これは、テストやデモに役立ちます。たとえば、INSERT ステートメントを追加することで、デプロイ時にデータベースに最小限のデータ セットを入力できます。ファイルの順序は重要です。特定のファイルのステートメントは、次のファイルのステートメントの前に実行されます。これらのステートメントは、スキーマが作成された場合、つまり hibernate.hbm2ddl.auto が create または create-drop に設定されている場合にのみ実行されます。

例 /humans.sql、/dogs.sql

于 2013-01-15T12:40:00.280 に答える