我在@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
进行注释时会抛出异常?
答案 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也建议这样做。