2016-07-26 8 views
2

私はこのようなドメインオブジェクトを持っています。 データベースからフェッチされたデータ(この例では「タイプ」)を使用して、正しいタイプのサービスをフェッチして注入する必要があります。@Configurableドメインオブジェクトプロパティを使用して、データに基づいて特定の動作を割り当てます。

私は、DBのデータを通話中に設定されていないことを意味し、この出力を得る:私は初期化ビーンにしようとすると、

entity is a bean postconstruct: PocProduct [id=null, type=null, productName=null].. attching behavior! 

は、私は同じresiltを取得します。 これを設定する正しい方法は何ですか?

@Entity 
@Table(name = "AAA_POC_PROD") 
@Configurable(dependencyCheck = true) 
@Scope("prototype") 
public class PocProduct implements Serializable, InitializingBean { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1136936011238094989L; 

    @Id 
    private String id; 
    private String type; 
    private String productName; 

    @Transient 
    private Behaviour behaviour; 

    @Transient 
    @Autowired 
    private BehaviourFactory behaviourFactory; 
    //getters and setters 

    @PostConstruct 
    public void attachBehavior() { 
     System.out.println("entity is a bean postconstruct: " + this + ".. attching behavior!"); 
     //Need to call this : depends on type which is fetched from DB 
     // this.behaviour = behaviourFactory.getTypeBasedBehaviour(type); 
    } 


} 
+0

JPAのバージョンによっては、@ PostConstructもSpringの代わりに呼び出されています。しかし、本当にそのような重い解決策が必要ですか?型は静的ですか? 'BehaviourFactory'はSpringによってどのように作成され、管理されていますか?異なる 'Behavior'インスタンスもSpring管理対象ですか? –

+0

私は言っている:春の豆と永続エンティティは、そのようにマージするべきではありません。私はあなたが探しているものが '@ PostLoad'であると言うでしょう – terjekid

+0

@M。 Deinum。Spring InitializingBean:afterPropertiesSet()もnull値を取得します。タイプは静的です。 bahviourfactoryは、オブジェクトの型に基づいて動作を返すシングルトンです。 – RCInd

答えて

3

設定可能豆を@Configurable.preConstruction属性の値に応じて、施工後または前に、春によって初期化されています。これは、次の一連のイベントを意味し、データベースからエンティティをロードする場合:

  1. JPAプロバイダが呼び出すことによって、エンティティを作成し、それはコンストラクタの反射
  2. 介しコンストラクタが実行している間、spring-aspects 'AnnotationBeanConfigurerAspectは、コンストラクタの実行をインターセプトしコンストラクタが実行される前(または後)にSpringは、プロパティの自動配線を含む、あなたのSpringコンテキストにある任意のBean設定を実行することによって、この新しく作成されたオブジェクトを設定します。
  3. JPAプロバイダはSpringですでに設定されているこのオブジェクトを受け取り、永続プロパティにDBからフェッチされたデータを取り込み始めます。
  4. オプションで、@PostLoadメソッドを設定した場合、JPAプロバイダはこれらのメソッドを呼び出して、エンティティがDBからのデータで完全に入力された後にエンティティが作業を行う機会を得ます。

この4番目のステップは、他のすべてが適切に動作していると仮定して、カスタム動作ロジックを配置する場所です。

関連する問題