0

Spring + JSF2 + Hibernate を使用して Web アプリケーションを構築しています。関連する 2 つのクラスは次のようになります。

@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 を使用してこれらのクラスにバインドされます。

私の質問は、すべてのフィールドが空白のままになっている場合 (ユーザーが値を送信しない場合)、自動バインドされた PhoneNumber を保存するように hibernate no に指示する方法です。つまり、Person オブジェクトを保存したいのですが、空の文字列を含むレコードをphone_numbersテーブルに表示したくありません。

そして、誰かが知っていれば、2 つのおまけの質問があります。

  1. Spring が PhoneNumber をバインドするのはいつですか? Person の作成時、または PhoneNumber のリクエストが JSF から送信されたときですか?
  2. required[解決しよう] フォームに、JSFの属性でマークされていないフィールドがあります。明らかに、そのようなフィールドが空のままの場合、検証はトリガーされません。問題は、Hibernate バリデーターを構成したときに、そのような必須ではないフィールドが空白のままでも検証されるようになったことです。requiredJSFのようにマークされていない空のフィールドの検証をスキップする方法はありますか? ビーンをセットしようとし<prop key="javax.persistence.validation.mode">CALLBACK</prop>ましたhibernatePropertiesSessionFactory、これは役に立ちませんでした。
4

1 に答える 1

1

2 つ目のおまけ質問の答えは次のとおりです。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 に答える