2016-08-16 16 views
1

私はEntity1という名前のエンティティを持っています。このエンティティは他の2つのエンティティと2対多の関係を持っていますEntity2Entity3フィールドに値がある場合、他のフィールドはNULLでなければなりません

Entity1テーブルにレコードを追加するたびに、Entity1は、Entity2またはEntity3との関係にする必要があります。

これは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がnullおよびその逆でなければなりません。

どうすればいいですか? 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; 
    } 

} 
関連する問題