当前位置: 首页 > 面试题库 >

在PropertyEditor中从数据库中获取实体

禹兴安
2023-03-14
问题内容

在Spring MVC中使用PropertyEditor时,让它们从数据库中获取实体是否不好?我应该改为创建一个空实体并设置其ID。

例如,实体Employee:

@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中获取Entity是一个坏主意:

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());
    }
}

可以绑定在控制器中:

@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:

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());
    }
}

这样,我们不会在窗体上每次有Employee时都进行往返数据库的访问,但是我不确定Hibernate是否可以按预期运行?


问题答案:

我认为这是合法的。我使用这种技巧已有一段时间,并且效果很好。

但是Spring
3.0有一个更好的概念。所谓的转换器(参考第5.5章Spring
3类型转换

此转换器的工作方式类似于属性编辑器的一种方式。但是它们是无状态的,并且由于具有更高的性能,因此可以被使用!

补充:Spring 3.0 没有(尚未)记录的功能。>
3:org.springframework.core.convert.support.IdToEntityConverter

它由ConcersationServiceFactory自动在ConversationService中注册。

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

/**
 * 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生成的实体。



 类似资料:
  • 问题内容: 我有2种情况,我要在codeigniter中提取同一表的全部数据和行总数,我想知道那是一种方法,可以从中获取行总数,整个数据和3个最新插入的记录通过一个代码在同一张桌子上 两种情况的控制器代码如下(尽管我分别使用不同的参数将其应用于每种情况) 1)从codeigniter中的表中获取全部数据 型号代码 查看代码 2)在Codeigniter中从表中获取行数 查看代码 问题答案: 您只能

  • 问题内容: 这是我的类,用于从数据库中获取数据 这是我的文件: 当我运行该程序时,出现异常后,请帮助我如何解决它。我是Hibernate的新手,尝试学习但被卡住了。 虽然我能够将数据存储在数据库中,但我有2个用于第一和第二类的数据获取数据,但在获取数据时遇到了问题PLZ帮助。 问题答案: 让我引述一下: 据我所知,您正在使用表名。 所以应该是这样的:

  • 我想从Firebase实时数据库中获取整个JSON数组。从实时数据库中提取数组并将其存储在自定义类的ArrayList中。

  • 我真的很难从数据库中收集数据。我正在使用实时数据库,我正在将这些值添加到一个可以单击的列表中。 当我单击列表上的用户时,我需要获取用户名值来创建聊天ID。这是我的问题,以获得键内的值。我现在的做法似乎行不通。 这是我的数据库 我需要取给“name”的值。 这是我的密码

  • 我想从数据库中获取数据(经度/纬度),并使用Ajax调用将其返回到Google地图上绘制多个标记。 下面是包含ajax的javascript: 在ajax设置中,当我输入“dataType:json”时,函数错误被执行。输出为警报“加载数据时出错”。 这是我的控制器: 我尝试console.log(响应),它显示整个javascript代码。 当前没有“数据类型:'json'”的错误显示“未捕获类