0

コマーシャルという名前のエンティティがあります。商用カテゴリのリストが保持されているCategoryエンティティがあります。カテゴリごとに、JOINED継承戦略でCommercialを拡張する個別のエンティティ(RestaurantCommercial、PhotoStudioCommercialなどの合計で最大20のエンティティなど)があります。

商業エンティティは、ある会社のコマーシャルのタイトル、テキスト連絡先番号などの一般的なプロパティを保持しますが、RestaurantCommercialおよびPhotoStudioCommercialは、そのカテゴリに関連する追加の特定のプロパティを保持します。

問題は、エンティティごとに個別のdaoとコントローラーを作成するのは少し手間がかかることです。そのため、この問題を処理するための適切な方法を探しています。

統合されたコントローラーが必要であり、フォームコントロールを処理し、Commercialを拡張するエンティティの新しいインスタンスを永続化するためのDAOである可能性があります。

これが私が考えていたおおよそのことです:

@RequestMapping(value={"/vendor/commercial/{categoryName}/new"}, method=RequestMethod.GET)
public String showNewCommercialForm(@PathVariable("categoryName") String categoryName,
                                    Map<String, Object> map) {
    Category category = categoryDAO.getCategoryByServiceName(categoryName);

    Class clazz = Class.forName(category.getClassName()); //here className is smth like domain.commercial.RestaurantCommercial

    map.put("commercialInstance", clazz.newInstance());
    //separate view for each category of commercial
    return "vendor/commercial/"+categoryName+"/new";
}

そして、このようなもののために別のバインダーを書かなければならないとしても、フォームデータを保存するための同様のコントローラーを考えていました。

したがって、質問は次のとおりです。この問題を処理するために何を提案しますか、またはすでに同様のニーズ(ジェネリック、リフレクション、またはその他)に直面している場合のベストプラクティスは何ですか?またはそれが価値があるかどうか、そしてその理由は?前もって感謝します。

4

1 に答える 1

0

このような場合に備えて、Daoインターフェースを作成します。

public interface Dao<T extends Commercial> {

    T getAll();
}

その後、抽象的なDao実装、たとえば休止状態ベース:

public CommonHibernateDao<T extends Commercial> implements Dao<T> 
{
    private final Class<T> entityType;

    protected CommonHibernateDao(Class<T> entityType) {
        this.entityType = entityType;
    }

    public List<T> getAll() {
        // hibernate get all implementation
    }
}

そしてRestaurantCommercialDaoのインターフェースと実装:

public interface RestaurantCommercialDao extends Dao<RestaurantCommercial> {

}

public class HibernateRestaurantCommercialDao extends CommonHibernateDao<RestaurantCommercial> implements RestaurantCommercialDao {

    public HibernateRestaurantCommercialDao() {
        super(RestaurantCommercial.class);
    }
}

すべての実装はCommonHibernateDaoに移動します。サブクラスでは、コンストラクターのみがneadedを呼び出します。基本的にはリフレクションでできますが、私ははっきりしていません。

コントローラ(RESTfull APIのようなもの)の場合:

@Controller
public class YourController() {

    @RequestMapping(value = "/restapi/{entityType}")
    public String postEntity(HttpServletRequest request, @PathVariable(value = "entityType") String entityType) {
        // If enetity name will be packegae + class name
        Object beanInstance = Class.forName(entityName);
        ServletRequestDataBinder binder = new ServletRequestDataBinder(beanInstance);
        binder.bind(request);

        // Here by type of entity you can get DAO and persist
    }
}

フォームの入力名がBeanの名前と同じである場合、バインディングはすべて自動的に行われます。

于 2012-06-18T12:47:41.843 に答える