在Struts 2中使用嵌套域对象进行CRUD的正确方法是什么?

时间:2011-01-20 01:18:28

标签: java model-view-controller struts2

我见过的示例显示了如何使用一个没有嵌套域对象(只是原语)的域对象来进行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的表单并要求输入以下内容:

姓名: _ _

年龄: _ ____

街道: _ __

状态: _ ____

邮编: _ __ _

婚姻状况:(具有相应密钥(实体的身份)/值的选择输入)

那么如何创建或更新具有自己标识的嵌套属性(在另一个表中保留)。

我正在使用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 个答案:

答案 0 :(得分:1)

我有一些建议

  1. 我怀疑MaritalStatus和Address是否需要成为他们自己的实体。您是否拥有独立于某人的地址或婚姻状况?如果是,那么好吧,如果不是,你应该制作MaritalStatus和地址组件

  2. 您的操作中的大多数代码都应该在另一个服务中。我建议创建一些门面服务,协调所有这些操作并将其移动到一个单独的层。我基本上是说将prepare方法移动到服务中。 Struts操作实际上只是用于调用您正在执行的服务,但是您调用服务的方式是业务逻辑,应该在服务中。操作应该只处理请求,调用业务逻辑并返回响应。您的门面服务将拥有完成其所需的所有服务。

  3. 该方法的一个好处是您可以重复使用该操作。就目前而言,如果你想要另一个行动来做同样的业务操作,你可能需要进行一些重构。

    您的具体问题的答案主要在第2位 - 您创建的服务会获取协调基础实体的创建和/或更新所需的所有参数。