6

エンティティがデータ ソースから読み取られた後に @Transient とマークされたフィールドに値を設定するための最良の解決策は何ですか?

私はEclipseLinkを使用しており、Spring Beanを使用して(明らかにDIを使用して)デフォルト値も取得する必要があるため、彼のpostBuildイベントソリューションでDescriptorEventAdapterを試していますが、私がしているより簡単なソリューションがあるかどうかはわかりますない。

前もって感謝します

4

2 に答える 2

6

リポジトリまたは DAO を使用している場合の簡単な方法は次のとおりです。

@Repository
class YourRepository {

    @Autowired
    private Bean bean;

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional(readOnly = true)
    public YourEntity find(..) {
        YourEntity entity = lookupUsingEntityManager();
        entity.transientField = bean.getDefaultValue();
        return entity;
    }
}

アクティブな record スタイルのエンティティを使用している場合の別のアプローチを次に示します。

@Entity
class YourEntity {

    @Transient
    public Object field;

    @PostLoad
    public void populateField() {
        field = new BeanHolder().bean.getDefaultValueForField();
    }

    @Configurable
    private static class BeanHolder {
        @Autowired private Bean bean;
    }
}

準擬似コードに注意してください。後者のアプローチは、コンパイル時またはロード時の AspectJ weaving with を使用する場合にのみ機能することに注意してください<context:spring-configured />

于 2013-08-31T21:38:51.270 に答える
0

一時的なフィールドを持つエンティティがあり、値は常に DI を使用してサービスから取得されますか?

  1. フィールドの目的は何ですか?エンティティメソッド内の計算に使用されますか?
  2. このような計算では、おそらくサービスのメソッドを使用して値を取得する必要があります。
  3. どのようなサービスからの値も使用されるため、そのような計算 (方法) がエンティティに属するかどうかはわかりません。

エンティティとサービスのライフサイクルはまったく異なることに注意してください。時間の経過とともに値が変化するため、エンティティのライフサイクルの開始時にエンティティのファクトリで値を提供しても意味がありませんか?

于 2013-08-30T19:53:45.793 に答える