Извлечение сущностей из БД в PropertyEditor - PullRequest
5 голосов
/ 08 апреля 2011

При использовании PropertyEditors со Spring MVC плохо ли, чтобы они выбирали сущности из базы данных? Должен ли я вместо этого создать пустую сущность и установить ее идентификатор.

Например, для субъекта Сотрудник:

@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 **/
}

Это плохая идея, чтобы получить Entity в PropertyEditor ниже с помощью следующего GenericEntityEditor:

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 и устанавливает его идентификатор:

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?

1 Ответ

6 голосов
/ 08 апреля 2011

Я думаю, что это законно.Я использовал этот метод в течение некоторого времени, и он хорошо работал.

Но у Spring 3.0 есть лучшая концепция.Так называемый конвертер (Справочная глава 5.5 Spring 3 Преобразование типов )

Эти конвертеры работают как односторонние редакторы свойств.Но они не имеют состояния, и из-за этого более производительны и могут быть повторно использованы!


Добавлено: Существует не (пока) документированная функция Spring 3.0.> 3:org.springframework.core.convert.support.IdToEntityConverter

Он автоматически регистрируется в ConversationService с помощью ConcersationServiceFactory.

Этот 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...