为什么Hibernate不抱怨' null'值必须是@NotNull?

时间:2015-09-05 14:12:20

标签: hibernate hibernate-4.x

我在@Entity class UpcomingOffer

中有这个
@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的{​​{1}}相关联。

为什么Hibernate在使用UpcomingOffer进行注释时会抛出异常?

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试将hibernate-validator添加到类路径

如果使用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'

如果您没有使用依赖项管理/构建工具,那么您必须手动下载jar并将其放在类路径中

另一个可能的问题,可能是相关的,也许不是,你的@OneToOne应该与Store实体或UpcomingOffer实体上的@JoinColumn配对。如果您正在进行双向映射,则其中一个也应该定义mappedBy属性。如果你让Hibernate生成数据库,它可能不会按预期生成它。

答案 1 :(得分:0)

@NotNull不是JPA注释,它是JSR 303/349注释(Bean Validation)。正如@greyfox建议的那样,如果你在你的类路径中添加hibernate-validator,那么hibernate会为你做验证,因为hibernate-validator是Bean Validation规范的一个实现。

但我认为如果你不想在那里接受null,那么适当的方法是使用适当的JPA注释将列标记为可为空

@Column(nullable = false)

请注意,根据您如何生成db表,您还需要更新SQL表。如果你让hibernate为你生成表,那么hibernate会将与注释字段关联的列标记为NOT NULL。

请注意,您可以采用任何一种方式(将验证保留给hibernate-validator,或者仅在数据库级别强制执行验证,或同时执行这两种操作)...但是,由于允许null,因此在数据库级别强制实施约束似乎是合适的对你没有意义。

编辑#1:

啊,我错过了这是一个外键领域的事实。所以是的,使用@OneToOne注释@greyfox也建议这样做。