通过JPA关系进行Bean验证

时间:2011-10-14 22:55:18

标签: jsf-2 jpa-2.0 java-ee-6 bean-validation

我想使用Bean Validation来注释我的实体中的约束,现在的问题是,实体上的关系是否也会得到验证?例如,假设我有以下实体:

@Entity
@Table(name = "css_empresa")
public class Empresa extends EntidadContactable implements Serializable,
    Convert {
private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name = "EMPRESA_ID_GENERATOR", sequenceName = ConstantesSecuencias.SEQ_EMPRESA)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMPRESA_ID_GENERATOR")
@Column(name = "cod_empresa", unique = true, nullable = false)
private Long id;

@Column(name = "num_ruc", precision = 13)
private BigDecimal numRuc;

@Column(name = "num_rup", precision = 15)
private BigDecimal numRup;

@Column(name = "txt_direccion_web", length = 255)
private String txtDireccionWeb;

@NotNull
@Column(name = "txt_nombre", nullable = false, length = 255)
private String txtNombre;

@Column(name = "txt_observaciones", length = 255)
private String txtObservaciones;

@OneToOne
@JoinColumn(name = "cod_usuario")
private Usuario administrador;

// bi-directional many-to-one association to DireccionEmpresa
@OneToMany(mappedBy = "empresa", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<DireccionEmpresa> direccionEmpresas;
    --Rest of code ommited for brevity

和DireccionEmpresa实体声明如下:

@Entity
@Table(name = "css_direccion_empresa")
public class DireccionEmpresa implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name = "DIREMPRESA_ID_GENERATOR", sequenceName = ConstantesSecuencias.SEQ_DIREMPRESA)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIREMPRESA_ID_GENERATOR")
@Column(name = "cod_direccion_empresa", unique = true, nullable = false)
private Long codDireccionEmpresa;

@Column(name = "sts_predeterminado", nullable = false, length = 1)
private String stsPredeterminado;

@NotNull
@Column(name = "txt_calle_principal", nullable = false, length = 120)
private String txtCallePrincipal;

@NotNull
@Column(name = "txt_calle_secundaria", length = 120)
private String txtCalleSecundaria;

@Column(name = "txt_descripcion", length = 120)
private String txtDescripcion;

@Column(name = "txt_informacion_adicional", length = 120)
private String txtInformacionAdicional;

@NotNull
@Column(name = "txt_numero", nullable = false, length = 10)
private String txtNumero;

@NotNull
@Column(name = "txt_sector", nullable = false, length = 60)
private String txtSector;

现在,问题是在保存Empresa时BeanBalidation会检查DireccionEmpresa约束吗?非常感谢。

1 个答案:

答案 0 :(得分:5)

不,持久存在DireccionEmpresa的实例时,Empresa的约束不会被验证。

通常,只有在使用@Valid annotation注释引用(例如普通对象引用或列表)时才会进行级联验证,而List<DireccionEmpresa> direccionEmpresas;则不是这样。

但即使该字段使用@Valid进行注释,JPA案例中也不会触发此级联验证,因为JPA 2规范在第3.6.1.2节中说明:

  

实体关联(单值或多值)不得出现验证级联(@Valid)。 [...这保证]在给定的冲洗周期内,任何实体都不会被多次验证。

因此,只有在持久保存该类型的实例时才会自动验证DireccionEmpresa处的约束。