2011-10-14 85 views
1

我想用Bean驗證註釋約束我的實體,現在的問題是,將在實體的關係進行驗證,以及?例如,假設我有以下實體:Bean驗證通過JPA關係

@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; 

現在的問題是將DireccionEmpresa約束被BeanValidation保存時Empresa與檢查?非常感謝。

回答

4

不,在DireccionEmpresa上的限制在持續Empresa的實例時不會被驗證。

通常級聯驗證將僅在引用(例如普通對象引用或列表)註釋爲@Valid annotation時發生,而List<DireccionEmpresa> direccionEmpresas;不是這種情況。

但是,即使該領域與@Valid這樣的級聯驗證註釋不會在JPA的情況下被觸發的JPA規範2節3.6.1.2說:

驗證級聯(@Valid)一定不會發生實體關聯(單值或多值)。 [...這保證]在給定的沖洗週期內,任何實體都不會被驗證多次。

所以DireccionEmpresa的限制條件只會在持久化該類型的實例時自動驗證。

+0

所以,我應該迭代引用並堅持每一個,爲了驗證發生? – Pablo

+0

在使用'CascadeType.ALL'時,當持久化Empresa實例時,被引用的對象會自動保留。這反過來會觸發他們的驗證,所以你不必自己做這個。規範只是確保引用的對象在持久擁有引用的對象和持久引用的對象本身時不會被驗證兩次。 – Gunnar

+0

好吧,所以我對相關實體的引用需要使用'@Valid'註釋進行註釋。換句話說: '@Valid '@OneToMany(mappedBy =「empresa」,fetch = FetchType.LAZY,cascade = CascadeType.ALL) private List direccionEmpresas; 將在Empresa對象被持久化時觸發DireccionEmpresa的驗證;這樣任何約束異常都將被嵌套關係中的JPA/JSF(等)捕獲。我明白了嗎? – Pablo