2

次のような汎用 DAO クラスがあります。

public class GenericDaoJpa <T extends DomainObject> implements GenericDao<T> {

    private final Class<T> type;

    @PersistenceContext(type=PersistenceContextType.TRANSACTION, unitName="myPersistenceUnit")
    protected EntityManager entityManager;

    public GenericDaoJpa(Class<T> type) {
        super();
        this.type = type;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public T get(Object id) {
        return (T) entityManager.find(type, id);
    }
}

実装 DAO クラスは次のようになります。

    @Repository("appDao")
    public class ProductDaoJpa extends GenericDaoJpa<Product> implements ProductDao{

    public ProductDaoJpa() {
        super(Product.class);
    }

    public List<Product> getAllProducts() {
        return getAll();
    }   
}

別のデータベース用に mySecondPersistenceUnit という別の persistentUnit を構成しました。GenericDaoJpa クラスも拡張するが、別の永続ユニットを使用する新しい DAO クラスを作成したいと思います。GenericDaoJpa クラスを拡張し、DAO ごとに異なる永続ユニットを使用するにはどうすればよいですか?

この宣言を各 DAO クラスに移動しようとしましたが、entityManager への参照がないため、親クラスがコンパイルされません。

@PersistenceContext(type=PersistenceContextType.TRANSACTION, unitName="myPersistenceUnit")
protected EntityManager entityManager;
4

1 に答える 1

3

代わりにメソッド インジェクションを使用してみてください。

public class GenericDaoJpa <T extends DomainObject> implements GenericDao<T> {

    @PersistenceContext(type=PersistenceContextType.TRANSACTION, unitName="myPersistenceUnit")
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}

異なる PU を使用する必要がある子クラスの間:

@Repository("appDao")
public class ProductDaoJpa extends GenericDaoJpa<Product> implements ProductDao{

    @Override
    @PersistenceContext(type=PersistenceContextType.TRANSACTION, unitName="mySecondPersistenceUnit")
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}
于 2012-05-22T14:33:18.713 に答える