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验证器现在可以工作了!