@Column
计量单位类别中,要设置某个字段不能为空。
因为对Hibernate
仅仅停留于了解阶段,去慕课网学习了一下Hibernate
的注解。
发现讲师介绍的@Column
注解有一项nullable
(可否为空)属性,默认为true
,这里尝试着添加该注解,并将nullable
属性设置为false
,不可为空。
@ApiModelProperty("学科类别")
@ManyToOne
// 设置学科类别字段不能为空
@Column(nullable = false)
@JsonView({NoneJsonView.class,
MeasurementUnitCategoryJsonView.getAllByDisciplineId.class})
private Discipline discipline;
异常
跑一下测试确保改这行代码整座桥不会塌。跑测试的时候却抛出了异常。
org.hibernate.AnnotationException: @Column(s) not allowed on a @ManyToOne property: com.mengyunzhi.measurement.entity.MeasurementUnitCategory.discipline
大体的意思就是:注解异常,@Column
注解不能应用在@ManyToOne
的属性上。
话不多说,直接谷歌。
解决方案
打开第一条:Use @JoinColumn instead of @Column
。使用@JoinColumn
而不是@Column
。
@Column(s) not allowed on a @ManyToOne property-StackOverflow
大体意思就是,因为加了一个@ManyToOne
的注解,所以这个属性就是外键。
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
注解是用于数据表中的普通字段之上。
而在外键之上用一个不适用于其的注解,当然报错啦。而@JoinColumn
注解才是官方为我们提供的为外键添加配置的注解。
@ApiModelProperty("学科类别")
@ManyToOne
// 设置学科类别字段不能为空
@JoinColumn(nullable = false)
@JsonView({NoneJsonView.class,
MeasurementUnitCategoryJsonView.getAllByDisciplineId.class})
private Discipline discipline;
将@Column
修改为@JoinColumn
,测试通过。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。