2017-12-22 5 views
0

SpringDataJPA/Hibernateを使用して@Id世代の同じカスタムIdentifierGeneratorを使用する多くのエンティティが私のプロジェクトにあります。同じカスタムIDジェネレータを使用して複数のエンティティの@GenericGenerator宣言を統一する方法は?

例エンティティ。

@Entity 
@Table(name = "CHAIRS") 
public class ChairEntity { 

    @Id 
    @GeneratedValue(generator = "myGenerator") 
    @GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = "myGenerator") 
    protected String id; 

    // rest of the entity 
} 

しかし、私はすべてのエンティティのすべてのidフィールドのため@GenericGenerator declerationを繰り返したくはありません。内部に醜いハードコーディングされたフルクラス名を含むこの注釈を隠す方法はありませんか?

ポストscriptum
私は以前idフィールドを含むBaseEntityクラスに@MappedSuperClassを利用し、私は、このようなスーパークラスを利用放棄しなければならなかったいくつかの技術的な理由によるものでした。明らかに、この質問に対する最も簡単な解決策です。

答えて

1

私が思いついたのソリューションは、Javaのトリックだった、私のすべてのエンティティがa.b.jpa.entity下にあり、a.b.jpa.generatorの私の発電機、および@GenericGeneratorは直接クラスで使用することができるので、私は、次の内容でpackage-info.javaa.b.jpa.entityためのパッケージを作成しました。私の質問のための完璧なソリューションです@GenericGenerator、とa.b.jpa.entity下のすべてのクラスをアノテート

@GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = MyGenerator.generatorName) 
package a.b.jpa.entity; 

import org.hibernate.annotations.GenericGenerator; 
import a.b.jpa.generator.MyGenerator; 

。基本的にすべてのエンティティで使用できるようにします。

ジェネレータのコード。

public class MyGenerator implements IdentifierGenerator { 

    public static final String generatorName = "myGenerator"; 

    @Override 
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object object) throws HibernateException { 
     return GeneratorUtil.generate(); 
    } 
} 

以下の状態のエンティティ。トリックをした

@Entity 
@Table(name = "CHAIRS") 
public class ChairEntity { 

    @Id 
    @GeneratedValue(generator = MyGenerator.generatorName) 
    protected String id; 

    // rest of the entity 
} 

、今@GenericGeneratorはそれらのいずれかがそれを使用したい場合、彼らはただ@GeneratedValueを利用、すべての私のエンティティにMyGenerator詳細を供給、単一の場所で定義されています。

1

またその後、あなたのエンティティは、それを拡張することができます@MappedSuperclass

@MappedSuperclass 
public abstract class BaseEntity { 

    @Id 
    @GeneratedValue(generator = "myGenerator") 
    @GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = "myGenerator") 
    protected String id; 

    // getters, setters here 

} 

を使用することができます。

@Entity 
@Table(name = "CHAIRS") 
public class ChairEntity extends BaseEntity { ... } 
+0

私は以前これを利用して、そしてこれはより良い解決策ですが、私の要件ということが正しいですそのようなスーパークラスを使わないように私に強いられました。私は質問を修正しましたが、あなたの答えはより広い範囲でこの質問に対して適切です。 –

関連する問題