0

我有一个名为 Commercial 的实体。我有一个类别实体,其中包含商业类别列表。对于每个类别,都有一个单独的实体扩展 Commercial(如 RestaurantCommercial、PhotoStudioCommercial 等,总共多达 20 个实体),具有 JOINED 继承策略。

商业实体持有一些公司商业广告的标题、文本联系人号码等一般属性,而 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 实现,例如基于 hibernate:

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
    }
}

以及RestaurantCommercial Dao接口和实现:

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 回答