@Column
计量单位类别中,要设置某个字段不能为空。java
由于对Hibernate
仅仅停留于了解阶段,去慕课网学习了一下Hibernate
的注解。学习
发现讲师介绍的@Column
注解有一项nullable
(能否为空)属性,默认为true
,这里尝试着添加该注解,并将nullable
属性设置为false
,不可为空。测试
@ApiModelProperty("学科类别") @ManyToOne // 设置学科类别字段不能为空 @Column(nullable = false) @JsonView({NoneJsonView.class, MeasurementUnitCategoryJsonView.getAllByDisciplineId.class}) private Discipline discipline;
跑一下测试确保改这行代码整座桥不会塌。跑测试的时候却抛出了异常。spa
org.hibernate.AnnotationException: @Column(s) not allowed on a @ManyToOne property: com.mengyunzhi.measurement.entity.MeasurementUnitCategory.discipline
大致的意思就是:注解异常,@Column
注解不能应用在@ManyToOne
的属性上。hibernate
话很少说,直接谷歌。code
打开第一条:Use @JoinColumn instead of @Column
。使用@JoinColumn
而不是@Column
。ip
@Column(s) not allowed on a @ManyToOne property-StackOverflowci
大致意思就是,由于加了一个@ManyToOne
的注解,因此这个属性就是外键。rem
package javax.persistence; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Column { String name() default ""; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updatable() default true; String columnDefinition() default ""; String table() default ""; int length() default 255; int precision() default 0; int scale() default 0; }
看一下@Column
注解的源码,咱们看到这其中的属性length
等显示不是外键应该有的属性,因此推测@Column
注解是用于数据表中的普通字段之上。get
而在外键之上用一个不适用于其的注解,固然报错啦。而@JoinColumn
注解才是官方为咱们提供的为外键添加配置的注解。
@ApiModelProperty("学科类别") @ManyToOne // 设置学科类别字段不能为空 @JoinColumn(nullable = false) @JsonView({NoneJsonView.class, MeasurementUnitCategoryJsonView.getAllByDisciplineId.class}) private Discipline discipline;
将@Column
修改成@JoinColumn
,测试经过。