Hibernate 为什么不是';不要冬眠着抱怨';空';必须为@NotNull的值?

Hibernate 为什么不是';不要冬眠着抱怨';空';必须为@NotNull的值?,hibernate,hibernate-4.x,Hibernate,Hibernate 4.x,我在我的@实体类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;

我在我的
@实体类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);
这会导致即将推出的优惠条目被更新,并且不会与拥有该
UpcomingOffer
商店关联

当Hibernate用
@NotNull
注释时,为什么它不在这里抛出异常



尝试将hibernate验证程序添加到类路径中

如果使用Maven,请将其添加到POM中:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.0.Final</version>
</dependency>
如果您没有使用依赖项管理/构建工具,那么您必须手动下载jar并将其放置在类路径中


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

尝试将Hibernate验证程序添加到类路径

如果使用Maven,请将其添加到POM中:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.0.Final</version>
</dependency>
如果您没有使用依赖项管理/构建工具,那么您必须手动下载jar并将其放置在类路径中


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

@NotNull不是JPA注释,而是JSR303/349注释(Bean验证)。正如@greyfox所建议的,如果您将hibernate validator添加到类路径中,那么hibernate将为您进行验证,因为hibernate validator是Bean验证规范的实现

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

@Column(nullable = false)
请注意,根据生成db表的方式,还需要更新SQL表或不更新SQL表。如果让hibernate为您生成表,那么hibernate将为您将与注释字段关联的列标记为NOTNULL

请注意,您可以选择任何一种方式(将验证留给hibernate validator,或者只在DB级别强制执行验证,或者同时执行这两种操作)。。。但是在DB级别强制执行约束似乎是合适的,因为允许null对您来说没有意义

编辑#1:


啊,我错过了这个事实,这是一个外键字段。所以是的,使用@OneToOne注释,正如@greyfox所建议的那样,可以达到目的。

@NotNull不是JPA注释,而是JSR303/349注释(Bean验证)。正如@greyfox所建议的,如果您将hibernate validator添加到类路径中,那么hibernate将为您进行验证,因为hibernate validator是Bean验证规范的实现

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

@Column(nullable = false)
请注意,根据生成db表的方式,还需要更新SQL表或不更新SQL表。如果让hibernate为您生成表,那么hibernate将为您将与注释字段关联的列标记为NOTNULL

请注意,您可以选择任何一种方式(将验证留给hibernate validator,或者只在DB级别强制执行验证,或者同时执行这两种操作)。。。但是在DB级别强制执行约束似乎是合适的,因为允许null对您来说没有意义

编辑#1:


啊,我错过了这个事实,这是一个外键字段。是的,使用@greyfox建议的@OneToOne注释也可以达到目的。

您使用的是什么版本的Hibernate?由于您直接使用hibernate API,我假设您没有使用JPA。@greyfox我使用的是
4.3.0.Final
。这可能不是它,但您的类路径上是否有hibernate validator?@greyfox我添加了一张图片,显示了我对“hibernate-”的hibernate依赖关系。我的类路径中似乎没有hibernate验证程序。您使用的是什么版本的hibernate?由于您直接使用hibernate API,我假设您没有使用JPA。@greyfox我使用的是
4.3.0.Final
。这可能不是它,但您的类路径上是否有hibernate validator?@greyfox我添加了一张图片,显示了我对“hibernate-”的hibernate依赖关系。我的类路径中似乎没有hibernate验证器。太棒了!非常感谢。我想我从来没有想过。我还使用Maven获得了
javax.validationvalidation api
,但是使用hibernate验证器现在可以工作了!令人惊叹的!非常感谢。我想我从来没有想过。我还使用Maven获得了
javax.validationvalidation api
,但是使用hibernate验证器现在可以工作了!