2016-08-16 44 views
1

我有一个名为Entity1的实体,该实体与其他两个实体Entity2Entity3有两个多对一的关系。当一个字段有值时,另一个字段必须为空

Entity1只能有我们每一个记录添加到Entity1表时间Entity2Entity3的关系。

这是Entity1的HBM文件:

<class name="Entity1" table="t_entity1_e1" optimistic-lock="version"> 
     <id name="id" column="e1_id"> 
      <generator class="native"/> 
     </id> 

     <property name="libelle" column="e1_libelle"/> 

     <many-to-one name="entity2" column="e1_entity2" class="Entity2"/> 
     <many-to-one name="entity3" column="e1_entity3" class="Entity3"/> 

     <many-to-one name="someOtherEntity" column="e1_other_entity" class="SomeOtherEntity"/> 
    </class> 

所以,我的意思是,当列e1_entity2有值的另一列e1_entity1必须为空,反之亦然。

我该怎么做?在SQL方面和在Java方面。

PS:我没有使用JPA。

回答

0

您可以在Hibernate中使用class level constraints来实现此目的。

约束定义:

@Target({ TYPE, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = { Entity1ConstraintValidator.class }) 
@Documented 
public @interface Entity1Constraint { 

    String message() default "Error message"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 
} 

验证定义:

public class Entity1ConstraintValidator 
     implements ConstraintValidator<Entity1Constraint, Entity1> { 

    @Override 
    public void initialize(Entity1Constraint constraintAnnotation) { 
    } 

    @Override 
    public boolean isValid(Entity1 entity1, ConstraintValidatorContext context) { 
     if (entity1 == null) { 
      return true; 
     } 
     if ((entity1.getEntity2() != null) && (entity1.getEntity3()) != null)) { 
      return false; 
     } 
     return true; 
    } 

} 
相关问题