Как правильно делать CRUD с вложенными объектами домена в Struts 2? - PullRequest
3 голосов
/ 20 января 2011

Я видел примеры, которые показывают, как сделать CRUD с одним объектом домена без вложенных объектов домена (только примитивы).Проблема заключается в том, как сделать то же самое с объектом домена, который имеет ссылки на другие объекты домена.Приведем следующий пример:

@Entity
public class Person implements Serializable {
    @Id
    private Long id;
    private String name;
    private Integer age;
    private Address address;
    private MaritalStatus maritalStatus;
... //getters/setters
}

@Entity
public class MaritalStatus implements Serializable {
    @Id
    private Long id;
    private String description;
... //getters/setters
}

@Entity
public class Address implements Serializable {
    @Id
    private Long id;
    private String street;
    private String state;
    private String zip;
... //getters/setters
}

Допустим, у меня есть форма, которая создает или обновляет Person, и запрашивает следующие данные:

Имя: _ _

Возраст: _ ____

Улица: _ __

Состояние: _ ____

Почтовый индекс: _ __ _

Семейное положение: (выбор ввода с соответствующим ключом (id объекта) / значением)

Итак, как вы можете создавать или обновлять, имея вложенные свойства, которые тоже имеют свою собственную идентичность (сохраняется)в другой таблице).

Я думал что-то вроде этого, используя метод prepare и paramsPrepareParamsStack:

public class PersonAction extends ActionSupport {
    public String save() {
        personService.save(person);
        return SUCCESS;
    }

    public String update() {
        personService.update(person);
        return SUCCESS;
    }

    public void prepare() {
        if (person.getId() != null) {
            //find the person using the id.
            Person p = personService.findById(person.getId());

            //Update the reference to the selected martial status
            //find the maritalstatus selected from the select box
            MaritalStatus maritalStatus = 
                maritalStatusSerivce.findById(person.getMaritalStatus().getId());
            //set the reference to the obtained person
            p.setMaritalStatus(maritalStatus);

            //find the address (in case it already exist)
            if (person.getAddress().getId() != null) {
                //find the address
                Address address = addressService.findById(person.getAddress().getId());
                //set the reference
                p.setAddress(address);
            }

            //finally set the obtained reference to the action person property
            this.person = p;
        } else { //New person
            //Find the address for the person
            if (person.getAddress().getId() != null) {
                //Only set the reference to the selected marital status
                //find the maritalstatus selected from the select box
                MaritalStatus maritalStatus = 
                    maritalStatusSerivce.findById(person.getMaritalStatus().getId());
                //set the reference to the person
                person.setMaritalStatus(maritalStatus);
            }
        }
    }

    private Person person;
    //getter/setters
}

Это правильный путь?Любой другой предложенный подход?

Спасибо

1 Ответ

1 голос
/ 20 января 2011

У меня есть несколько предложений

  1. Я спрашиваю, должны ли MaritalStatus и Address быть их собственными сущностями. Будет ли у вас когда-нибудь адрес или семейное положение независимо от человека? Если да, то хорошо, если нет, вы должны сделать MaritalStatus и Address компоненты

  2. Большая часть кода в вашем действии должна быть в другом сервисе. Я бы порекомендовал создать некоторый вид фасадного сервиса, который координирует все эти операции и перенесет его в отдельный слой. Я в основном говорю, переместить метод подготовки в службу. Действие Struts действительно просто для вызова сервисов, которые вы делаете, однако способ, которым вы вызываете сервисы, - это бизнес-логика, которая должна быть в сервисе. Действия должны просто обрабатывать запросы, вызывать бизнес-логику и возвращать ответ. Ваш фасадный сервис будет иметь все услуги, необходимые для его работы.

Одним из преимуществ такого подхода является то, что вы можете затем повторно использовать операцию. В настоящее время, если бы вы хотели, чтобы другое действие выполняло ту же бизнес-операцию, вам понадобился бы рефакторинг.

Ответ на ваш конкретный вопрос в основном находится под номером 2 - вы создаете службу, которая принимает все аргументы, необходимые для координации создания и / или обновления базовых объектов.

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