2015-09-05 2 views
1

У меня это в моем @Entity class UpcomingOffer:Почему Hibernate не жалуется на значение «null», которое должно быть @NotNull?

@Entity 
public class UpcomingOffer { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="ID") 
    private Long id; 

    @NotNull // Must not be null! 
    @OneToOne 
    private Store store; 

    // ... 
} 

, но по какой-то причине я могу спасти StoreOffer, не имея Store набор:

UpcomingOffer upcomingOffer = new UpcomingOffer(); 

    DateTime date = new DateTime(upcomingOfferDto.getDate()); 
    upcomingOffer.setDate(date); 
    upcomingOffer.setStore(null); 

Сохранение это не вызывает исключение:

Session session = getSessionFactory().getCurrentSession(); 
session.saveOrUpdate(upcomingOffer); 

, который вызывает внесение нового предложения и не связан с Store, которому принадлежит UpcomingOffer.

Почему Hibernate не выбрасывает исключение здесь, когда оно аннотируется @NotNull?


enter image description here

+0

Какую версию Hibernate вы используете? Поскольку вы используете API hibernate напрямую, я предполагаю, что вы не используете JPA. – greyfox

+0

@greyfox Я использую '4.3.0.Final'. – displayname

+0

Возможно, это не так, но это hibernate-validator на вашем пути к классу? – greyfox

ответ

0

Попробуйте добавить гибернации-валидатор к вашему пути к классам

При использовании Maven добавить к вашему POM:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.3.0.Final</version> 
</dependency> 

Если Gradle добавить это build.gradle

'org.hibernate:hibernate-validator:4.3.0.Final' 

Если вы не используете инструмент управления зависимостями/сборкой, вам придется вручную загрузить банку и поместить ее в свой путь к классу.

Еще одна возможная проблема, возможно, связанная, может быть, и не ваша @OneToOne должна быть сопряжена с @JoinColumn как для объекта Store, так и для объекта UpcomingOffer. Если вы выполняете составление битриграмм, одно из них должно также иметь свойство mappedBy. Если вы позволяете Hibernate генерировать базу данных, возможно, она не генерирует ее, как предполагалось.

+0

Удивительный! Огромное спасибо. Думаю, я бы никогда об этом не думал. Я также получил ' javax.validation validation-api' включено, используя Maven, но с использованием hibernate-validator работает сейчас! – displayname

+0

Отличный, рад, что он сработал – greyfox

+0

Мне тоже .....! : D – displayname

0

@NotNull не является аннотацией JPA, ее аннотацией JSR 303/349 (проверка бина). Как предположил @greyfox, если вы добавите hibernate-validator в свой путь к классам, тогда hibernate проведет проверку для вас, потому что hibernate-validator является реализацией спецификации проверки Bean.

Но я думаю, что если вы не хотите, чтобы принять нуль там, то соответствующий путь будет пометить столбец как обнуляемые с помощью соответствующего JPA аннотации

@Column(nullable = false) 

Заметьте, что в зависимости от как вы генерируете таблицы db, тогда вам также нужно будет обновить таблицу SQL или нет. Если вы даете hibernate генерировать таблицы для вас, то hibernate будет отмечать столбец, связанный с аннотированным полем, как NOT NULL для вас.

Обратите внимание, что вы можете пойти в любом случае (оставьте валидацию в hibernate-validator или просто выполните проверку на уровне базы данных или выполните оба) ... но представляется целесообразным принудительное применение ограничения на уровне БД, поскольку null не имеет смысла для вас.

Edit # 1:

Ах, я пропустил тот факт, что это иностранный ключ поле. Так что да, используя @OneToOne аннотацию, как и @greyfox, также предложил сделать трюк.

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