首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PropertyEditor中的DB获取实体

从PropertyEditor中的DB获取实体
EN

Stack Overflow用户
提问于 2011-04-08 18:08:48
回答 1查看 1K关注 0票数 5

在Spring MVC中使用PropertyEditors时,让它们从数据库中获取实体是不是很糟糕?我是否应该创建一个空的实体并设置它的Id。

例如,对于实体Employee:

代码语言:javascript
复制
@Entity
@Table(name = "employee")
public class Employee implements GenericEntity<Integer>{

    @Id
    @GeneratedValue
    @Column(name = "employee_id")
    public Integer getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(Integer employeeId) {
        this.employeeId = employeeId;
    }

    /** More properties here **/
}

用下面的GenericEntityEditor获取下面PropertyEditor中的实体是不是一个坏主意:

代码语言:javascript
复制
public class GenericEntityEditor<ENTITY extends GenericEntity<Integer>> extends PropertyEditorSupport {

    private GenericDao<ENTITY, Integer> genericDao;

    public GenericEntityEditor(GenericDao<ENTITY, Integer> genericDao) {
        this.genericDao = genericDao;
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(genericDao.findById(Integer.valueOf(text)));
    }

    @SuppressWarnings("unchecked")
    @Override
    public String getAsText() {
        ENTITY entity = (ENTITY) getValue();
        if(entity == null) {
            return null;
        } 

        return String.valueOf(entity.getId());
    }
}

可以在控制器中绑定:

代码语言:javascript
复制
@Controller
public class EmployeeController {
    /** Some Service-layer resources **/

    @Resource
    private EmployeeDao employeeDao; // implements GenericDao<ENTITY, Integer> genericDao

    @SuppressWarnings("unchecked")
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Employee.class, new GenericEntityEditor(employeeDao));
    }

    /** Some request mapped methods **/

}

对EmployeeEditor使用更具体的方法,让它只实例化一个Employee实体并设置它的id:

代码语言:javascript
复制
public class EmployeeEditor extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Employee employee = new Employee();
        employee.setId(Integer.valueOf(text));
    }

    @SuppressWarnings("unchecked")
    @Override
    public String getAsText() {
        Employee employee = (Employee) getValue();
        if(employee == null) {
            return null;
        } 

        return String.valueOf(employee.getId());
    }
}

通过这种方式,我们不会在每次表单上存在员工时都来回访问数据库,但我不确定Hibernate是否能像预期的那样工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-08 22:17:42

我认为这是合法的。我使用这个技术有一段时间了,它工作得很好。

但是Spring3.0有一个更好的概念。所谓的Converter (参考章节5.5 Spring 3 Type Conversion)

此转换器的工作方式类似于单向属性编辑器。但它们是无状态的,因此性能更高,可以重复使用!

添加: org.springframework.core.convert.support.IdToEntityConverter是Spring 3.0.>3的一个not (yet) documented特性

它由ConcersationServiceFactory自动注册到ConversationService中。

此IdToEntityConverter将自动将所有内容(对象)转换为实体,如果是实体!!有一个静态方法find<entityName>,它有一个参数,返回类型是实体的类型。

代码语言:javascript
复制
/**
 * Converts an entity identifier to a entity reference by calling a static finder method
 * on the target entity type.
 *
 * <p>For this converter to match, the finder method must be public, static, have the signature
 * <code>find[EntityName]([IdType])</code>, and return an instance of the desired entity type.
 *
 * @author Keith Donald
 * @since 3.0
 */

如果您对如何在实体中实现此类静态查找器方法有疑问。然后看看Spring Roo生成的实体。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5593581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档