Проверка бина через отношения JPA - PullRequest
2 голосов
/ 15 октября 2011

Я хотел бы использовать 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;

Теперь вопрос заключается в том, будут ли ограничения DireccionEmpresa проверяться BeanValidation при сохранении Empresa ?? Большое спасибо.

1 Ответ

5 голосов
/ 15 октября 2011

Нет, ограничения на DireccionEmpresa не будут проверяться при сохранении экземпляра Empresa.

Обычно каскадная проверка происходит только в том случае, если ссылка (например, ссылка на простой объект или список) помечена @ Допустимая аннотация , что не относится к List<DireccionEmpresa> direccionEmpresas;.

Но даже если это поле было аннотировано @Valid, такая каскадная проверка не будет запущена в случае JPA, как указано в спецификации JPA 2 в разделе 3.6.1.2:

Каскад валидации (@Valid) не должен иметь место для ассоциаций сущностей (однозначных или многозначных). [... Это гарантирует], что [...] ни один объект не будет проверен более одного раза в течение данного цикла очистки.

Таким образом, ограничения на DireccionEmpresa будут проверяться автоматически только при сохранении экземпляра этого типа.

...