0

我正在使用 Spring + JSF2 + Hibernate 构建一个 Web 应用程序。两个相关的类如下所示:

@Entity
@Table(name="people")
@Named
public class Person implements Serializable {
private int id;
private String forename;
@Inject private PhoneNumber mobile_phone;
/* Other properties */

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="mobile_phone_number_id", nullable = true)
public PhoneNumber getMobilePhone() {
  return mobile_phone;
}
/* Other getters and setters */
}

@Entity
@Table(name="phone_numbers")
@Named
public class PhoneNumber {
private Integer id;
private String code;
private String number;
/* Other stuff */
}

依赖注入由 Spring ( @Named, @Inject) 处理。数据库持久性是通过 Hibernate 注释 ( @OneToOne, @JoinColumn) 配置的。JSF 表单元素使用 EL 绑定到这些类。

我的问题是如果所有字段都留空(用户不提交任何值),如何告诉休眠不保存自动绑定的电话号码?换句话说,我希望保存 Person 对象,但不希望phone_numbers表中出现空字符串的记录。

如果有人知道,还有两个额外的问题。

  1. Spring 何时绑定 PhoneNumber - 在创建人员时或来自 JSF 的 PhoneNumber 请求时?
  2. [已解决] 我的表单中有没有用requiredJSF 中的属性标记的字段。显然,如果这些字段为空,则不应触发验证。问题是,当我配置 Hibernate 验证器时,即使留空,现在也会验证这些非必填字段。是否有任何方法可以跳过未标记为requiredJSF 的空字段的验证?我试图设置bean <prop key="javax.persistence.validation.mode">CALLBACK</prop>,但这没有帮助。hibernatePropertiesSessionFactory
4

1 回答 1

1

第二个附赠问题有以下答案:JSF 将空字段视为空字符串,因此必须设置

<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>

在 web.xml 中将空字符串解释为 null。显然,一个空字符串不能很好地验证我的正则表达式验证模式。

于 2013-04-03T10:07:53.963 回答