我见过的示例显示了如何使用一个没有嵌套域对象(只是原语)的域对象来进行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
}
这是正确的方法吗?还有其他建议的方法吗?
由于
答案 0 :(得分:1)
我有一些建议
我怀疑MaritalStatus和Address是否需要成为他们自己的实体。您是否拥有独立于某人的地址或婚姻状况?如果是,那么好吧,如果不是,你应该制作MaritalStatus和地址组件
您的操作中的大多数代码都应该在另一个服务中。我建议创建一些门面服务,协调所有这些操作并将其移动到一个单独的层。我基本上是说将prepare方法移动到服务中。 Struts操作实际上只是用于调用您正在执行的服务,但是您调用服务的方式是业务逻辑,应该在服务中。操作应该只处理请求,调用业务逻辑并返回响应。您的门面服务将拥有完成其所需的所有服务。
该方法的一个好处是您可以重复使用该操作。就目前而言,如果你想要另一个行动来做同样的业务操作,你可能需要进行一些重构。
您的具体问题的答案主要在第2位 - 您创建的服务会获取协调基础实体的创建和/或更新所需的所有参数。