2015-09-05 81 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); 

这导致即将到来的报价的输入被更新并且不与相关联拥有那UpcomingOffer

为什么Hibernate在用@NotNull注释时在这里抛出异常?


enter image description here

+0

你使用的是什么版本的Hibernate?由于您直接使用hibernate API,我假设您没有使用JPA。 – greyfox

+0

@greyfox我正在使用'4.3.0.Final'。 – displayname

+0

这可能不是它,而是你的类路径上的hibernate-validator? – greyfox

回答

0

尝试增加休眠,验证到classpath

如果使用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。如果您正在进行bidriectional映射,其中一个映射也应该具有mappedBy属性。如果你让Hibernate生成数据库,它可能不会按照预期生成它。

+0

太棒了!非常感谢。我想我永远不会想到这一点。我也得到了'使用Maven包含但是使用hibernate-validator现在可以工作的' javax.validation validation-api! – displayname

+0

太棒了,很高兴它的工作 – greyfox

+0

我也是.....! :d – displayname

0

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

但我认为,如果你不想在那里接受空,然后以适当的方式去将是使用依赖于正确的JPA注释

@Column(nullable = false) 

注意,以纪念列可空你如何生成数据库表,那么你还需要更新你的SQL表或不。如果您让hibernate为您生成表格,那么hibernate会将与注释字段关联的列标记为NOT NULL。

请注意,您可以采取任何一种方式(将验证保留为hibernate-validator或仅在数据库级执行验证,或同时执行验证)......但似乎适合在DB级执行约束,因为允许null对你没有意义。

编辑#1:

啊,我错过了事实,这是一个外键字段。所以是的,使用@OneToOne注解作为@ greyfox也建议可以做到这一点。

相关问题