2017-02-07 13 views
4

У меня есть вопрос, связанный с javax.validation.constraints.NotNull annotation. В моем проекте у меня есть классы дерево, как следующее:@NotNull в подклассе getter влияет на таблицу родительского класса

@Inheritance(strategy = InheritanceType.JOINED) 
class Ssss { 
    @ManyToOne 
    private Xxxx x; 
    public Xxxx getXxxx() { 
     return x; 
    } 
} 

@Inheritance(strategy = InheritanceType.JOINED) 
class Yyyy extends Ssss { 
    @Override 
    //some not important annotations 
    public Xxxx getXxxx() { 
     return super.getXxxx(); 
    }   
} 

@Inheritance(strategy = InheritanceType.JOINED) 
class Zzzz extends Ssss { 
    @Override 
    //some not important annotations 
    @NotNull 
    public Xxxx getXxxx() { 
     return super.getXxxx(); 
    } 
} 

Эти три класса хранится в базе данных в виде трех таблиц. Для создания схемы я использую Hibernate:

hibernate.hbm2ddl.auto=create 

Это ожидаемое поведение, Hibernate добавляет NOT NULL на xxxx_object_id поля хранится в таблице генерироваться для супер класса ГССЫ как следующее: ??

Postgres

Я не мог найти любую соответствующую информацию о том, как зимуют лечит @NotNull на унаследованных добытчиками.

Может ли кто-нибудь помочь мне по этому вопросу?
С наилучшими пожеланиями.
Michal

ответ

1

Да. Спящий режим имеет ограничения, которые он продолжает проверять в случае конфликтов.
Вот пример:

@Inheritance(strategy = InheritanceType.JOINED) 
class Ssss { 

    @ManyToOne 
    private Xxxx x; 
    public Xxxx getXxxx() { 
     return x; 
    } 
} 

Если бы это было это много, то спящий режим не имеет конфликта, как это делает x типа Xxxx в нулевого
Но вот вопрос, в этот код:

@Inheritance(strategy = InheritanceType.JOINED) 
class Zzzz extends Ssss { 
    @Override 
    //some not important annotations 
    @NotNull 
    public Xxxx getXxxx() { 
     return super.getXxxx(); 
    } 
} 

Здесь Hibernate с помощью @NotNull аннотаций сказал, чтобы сделать x тип Xxxx в @NotNull
В двух вышеуказанных случаях, возникает конфликт, для Ssss может быть Null и ZZZZ это не может быть пустым. Чтобы сделать вывод о том, что и разрешить конфликт, Hibernate также делает переменную типа Xxxx для Ssss как NotNull.

0

@NotNull аннотация JSR 303 Bean Validation. Это предназначено для проверки, чтобы убедиться, что значение экземпляра этого свойства (поля) Entity будет отскакивать от любых процессов, которые нарушают это ограничение. Это не имеет никакого отношения к созданию таблицы

Вместо этого мы используем @Column(nullable = false) Это для базы данных. В частности, при использовании опции для создания схемы (если вы используете спящий режим для генерации DDL), гарантирует, что свойство «NULLABLE» присваивается соответствующему столбцу таблицы базы данных (поле).

Пожалуйста, смотрите ссылку ниже для большей ясности Confusion: @NotNull vs @Column(nullable = false)

+0

Спасибо за ваш ответ, но вы не совсем правы. Как @PascalThivent писал: «Если свойство вашего объекта аннотируется ** @ NotNull **, его столбцы будут объявлены как не равные нулю в схеме DDL, сгенерированной Hibernate». Посмотрите эту тему: http://stackoverflow.com/questions/3676778/stop-hibernate-from-creating-not-null-constraints После смены hibernate.validator.apply_to_ddl на ** false **, был no ** NOT NULL ** в столбце xxxx_object_id :) – www

0

Благодаря @Tahir.

Я тестировал один и тот же сценарий, но с аннотацией @Size.
Суперкласс (Ssss) имел некоторое поле Строки:

@Inheritance(strategy = InheritanceType.JOINED) 
class Ssss { 
    @ManyToOne 
    private String description; 

    @Size(min = 100, max = 150) 
    public String getDescription() { 
     return description; 
    } 
} 

@Inheritance(strategy = InheritanceType.JOINED) 
class Yyyy extends Ssss { 

    @Override 
    @Size(min = 10, max = 60) 
    public String getDescription() { 
     return description; 
    }   
} 

@Inheritance(strategy = InheritanceType.JOINED) 
class Zzzz extends Ssss { 

    @Override 
    @Size(min = 200, max = 255) 
    public String getDescription() { 
     return description; 
    } 
} 

В такой ситуации Hibernate генерируется столбец с такой же макс шириной, как и для суперкласса (СВА): enter image description here
Я прав, что спящий режим не мог разрешить конфликт так считал max только от Ssss? Знаете ли вы правила разрешения подобных конфликтов и что такое поведение спящего режима при использовании аннотаций, таких как @Pattern, @Min или @Max?

С уважением