gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:18 27 4
gpt4 key购买 nike

当将 PropertyEditors 与 Spring MVC 一起使用时,让它们从数据库中获取实体是不是很糟糕?我是否应该创建一个空实体并设置其 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 中获取实体是不是一个坏主意:

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中绑定(bind):

@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 存在于 Form 上时都往返于 DB,但我不确定这在 Hibernate 中是否能按预期工作?

最佳答案

我认为这是合法的。我使用这种技术有一段时间了,效果很好。

但是Spring 3.0有一个更好的概念。所谓Converter (引用章节5.5 Spring 3 Type Conversion)

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


添加:有一个 not (yet) documented 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 生成的实体。

关于java - 在 PropertyEditor 中从数据库中获取实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5593581/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com