2014-10-08 6 views
0

У меня есть три объекта JPA: A, B и C. B и C наследуют A с объединенной стратегией. Возможно ли переопределить ограничение проверки Bean в подклассах? Например, я хотел бы, чтобы B имел ограничение @NotNull в одном поле, а C - ограничение @Null в том же поле.JPA - переопределить проверку бина в объединенном стратегическом наследовании

Я думал сделать это, используя группы проверки Bean, однако я не знаю, как определить, что B должен быть проверен с одной группой и C с другой группой.

Код для иллюстрации проблемы:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
... 
public abstract class A { 
    ... 
    @Column(name="FIELD") 
    private Integer field; 
    ... 
} 

@Entity 
public class B extends A { 
    ... 
    //@NotNull in field 
    ... 
} 

@Entity 
public class C extends A { 
    ... 
    //@Null in field 
    ... 
} 

ответ

0

Я думаю, что я пришел к решению, читая этот другой вопрос о проверке условного боба: Conditional Bean Validation.

Он все еще не проверен, но я думаю, что он может работать.

Код решения:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
... 
public abstract class A { 
    ... 
    @Column(name="FIELD") 
    private Integer field; 
    ... 
} 

@Entity 
public class B extends A { 
    ... 
    @Transient 
    @AssertTrue 
    private boolean isValidClassA() { 
     return (getField() != null); //Validates NotNull 
    } 
    ... 
} 

@Entity 
public class C extends A { 
    ... 
    @Transient 
    @AssertTrue 
    private boolean isValidClassA() { 
     return (getField() == null); //Validates Null 
    } 
    ... 
} 
+0

Непросто переместить поле атрибута в B и C? – uaiHebert

+0

Нет, потому что он мне нужен, когда вы запрашиваете сущности A. – Aliuk

0

Если вам нужна эта проверка во время сохраняются или объединить операции, почему бы вам не определить заранее обратные вызовы prersist/обновление?

public class Base { 

    protected String myData; 
} 

public class ConcreteA { 

    @PrePersist 
    @PreUpdate 
    private void checkDataNotNull() { 
    assert(mydata).isNotNull(); 
    } 
} 

public class ConcreteB { 

    //myData may be null, so dont do any check 
} 

Вы гарантированно то, что данные не будут сохранены в базе данных для ConcreteA если он нулевой, и будет сгенерирована ошибка. Вам больше не нужно вручную проверять поле, если оно не пустое вручную.

 Смежные вопросы

  • Нет связанных вопросов^_^