2016-12-06 4 views
1

JPAを使用していくつかのデータベーステーブルを使用する単純なWebアプリケーションを開発しました。テーブルAとテーブルBを表Aを参照して考えてみましょう。私のアプリケーションは、開発、テスト、および製造段階のような顧客のさまざまな環境で動作します。そのため、これらの環境間でデータをエクスポート/インポートするプロセスを作成する必要があります。JPAを使用して同じ識別子を使用してデータをインポートする

オブジェクトを移動するとき、同じIDを保持したいので同じIDを保持したいと思います。 JPAでこれを行う方法はありますか?

OracleデータベースでHibernate 4.3.8を使用しています。

@Entity 
@Table 
public class Category 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
} 

そして私はそれをやろうとしています:これは私のエンティティである

Category category = new Category(); 
category.setId(1L); 
category.setName("Test"); 

EntityManager em = PersistenceManager.getEntityManager(); 
em.merge(category); 

しかし、それは代わりに与えられたものを使用してのIDを生成するために、休止状態のシーケンスを使用しています。 mergeの代わりにpersistを使用すると、デタッチされたオブジェクトなので例外がスローされます。

これを行う方法はありますか?

+0

"インポートプロセス"はSQLインポートスクリプトを使用し、 "javax.persistence.XXX"プロパティを使用してインポートすると考えていたでしょう –

+0

こんにちはNeil、それは輸出と輸入のプロセス。 SQLインポートスクリプトを使用する場合は、エクスポート側で生成する必要があります。 JPAでこれを行う方法はありますか? – chupetoide

答えて

0

はい、あなたはあなたが拡張するクラスを必要とする定義されたシーケンス

を使用してカスタムIDジェネレータを定義することができorg.hibernate.id.SequenceGenerator

package yourPackage; 

public class CustomGenerator extends SequenceGenerator 
{ 
    @Override 
    public Serializable generate(SessionImplementor session, Object obj) 
    { 
     ... 
    } 
} 

そしてあなたのエンティティでカスタム・ジェネレータを使用する:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CustomGenerator") 
@GenericGenerator(name = "CustomGenerator", 
     strategy = "yourpackage.CustomGenerator", 
     parameters = { 
      @Parameter(name = "sequence", value = "custom_id_sequence") 
     }) 
private Long yourId; 
+0

こんにちはマッテオ!ご回答有難うございます。私はちょうどインポートプロセス中に定義されたIDを使用したい。それ以外の場合は、シーケンスまたはデフォルトのジェネレータ戦略を使用する必要があります。したがって、戦略は "id == null?generate:this.id"のようにする必要があります。同意しますか ? – chupetoide

関連する問題