时,与表单中字段有关的课程对象将收到用户的更新。当调用该操作方法时,必须重新使已更新的对象与持久化上下文建立联系。通过使用 save() 方法将该对象传递回服务层,就可以实现。
但是等等 —— 验证在哪里?您肯定不希望无效数据损坏您的数据库!另一方面,您可能不希望验证标记打乱您的视图模板。您甚至可能同意验证代码不属于视图层的说法。幸运的是,Seam 负责完成 JSF 验证的琐碎工作!
借助 Seam 和 Hibernate 进行验证
如果您将整个表单包装到一个 s:validateAll 组件标记中, Seam 允许您在 JSF 的流程验证(Process Validation)阶段执行对数据模型定义的验证。这种验证方法比以下方法更有吸引力:在视图中到处设置 JSF 验证器标记,或者维护一个配置文件,写满针对第三方验证框架的验证定义。取而代之,可以使用 Hibernate Validator 注释向实体类属性指派验证标准,如清单 13 所示。然后 Hibernate 在持久化对象时,对验证进行两次检查,为您提供双重保护。这个双重保障方法意味着视图中不小心出现的 bug 没有任何机会危害您的数据质量。(请参阅 参考资料 了解关于 Hibernate Validator 的更多内容。)
清单 13. 带有 Hibernate 验证注释的课程实体
@Entity
@Table(name = "course")
public class Course implements Serializable {
private long id;
private String name;
private CourseType type = CourseType.PUBLIC;
private Address address;
private String uri;
private String phoneNumber;
private String description;
public Course() {}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
@NotNull
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "name")
@NotNull
@Length(min = 1, max = 50)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "type")
@Enumerated(EnumType.STRING)
@NotNull
public CourseType getType() {
return type;
}
public void setType(CourseType type) {
this.type = type;
}
@Embedded
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Column(name = "uri")
@Length(max = 255)
@Pattern(regex = "^https?://.+contentquot;, message = "validator.custom.url")
public String getUri() {
return this.uri;
}
public void setUri(String uri) {
this.uri = uri;
}
@Column(name = "phone")
@Length(min = 10, max = 10)
@Pattern(regex = "^\\d*contentquot;, message = "validator.custom.digits")
public String getPhoneNumber() {
return this.phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Column(name = "description")
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
// equals and
|