在@Column中对nullable = true进行Hibernate处理

Adi*_*tya 11 java mysql orm hibernate jpa

我正在使用Hibernate和一个由Mysql db支持的Springs.

这是与我用来创建条目的实体类似的实体

@Entity
@Table(name = "my_table") {

    @Basic
    @Column(name = "my_string", nullable = false)
    private String myString;
}
Run Code Online (Sandbox Code Playgroud)

sql定义是

CREATE TABLE `my_table` (
 `my_string` varchar(200) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

虽然该表允许空值,但myString列根据JPA注释是不可为空的.这导致了不可预测的行为.

问:在插入时,是否在实体级强制执行不可为空的ALWAYS?或者是否存在可能被忽略的情况

我的期望是所有参赛作品都应该被拒绝.但是通过这种设置,许多条目(> 7000)进入了表格.有时我只能从spring获得DataIntegrityViolation异常

org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: ...; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:652)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58) 
    ....  
    ....
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
    at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:103)
    ....
Run Code Online (Sandbox Code Playgroud)

我知道在实体和表中使用单独的签名是一种不好的做法,但我正在尝试找出导致此行为的原因以及可能因此而遗漏的任何其他漏洞.

Versions -
Mysql- 5.5
Hibernate - 4.0.0
Hibernate-jpa - 2.0
Spring-core- 3.1.0
Spring-jdbc- 3.1.2
Run Code Online (Sandbox Code Playgroud)

Vla*_*cea 8

人们经常混淆@Column(可空)和@NotNull注释.

@Column(nullable)是为生成的DDL脚本.但是你不使用Hibernate生成你的DDL,所以你根本不应该依赖它.你想要的是@NotNull哪个是运行时验证触发器.

如果您定义了Hibernate Validator Annotation(或JPA 2.0),那么您也可以获得这些注释的DDL:

开箱即用,Hibernate(从版本3.5.x开始)会将您为实体定义的约束转换为映射元数据.例如,如果实体的属性注释为@NotNull,则其列将在Hibernate生成的DDL模式中声明为非null.

如果您将JPA与Hibernate一起使用,请确保启用验证.

如果您使用JPA 2并且Hibernate Validator在类路径中,则JPA2规范要求启用Bean Validation.属性javax.persistence.validation.group.pre-persist,javax.persistence.validation.group.pre-update和javax.persistence.validation.group.pre-remove,如第10.1.2节"Hibernate基于事件的描述"中所述验证"在这种情况下可以在persistence.xml中配置.persistence.xml还定义了一个节点验证模式,可以设置为AUTO,CALLBACK,NONE.默认为AUTO.