注解异常 @Column(s) not allowed on a @ManyToOne property

@Column

计量单位类别中,要设置某个字段不能为空。java

由于对Hibernate仅仅停留于了解阶段,去慕课网学习了一下Hibernate的注解。学习

clipboard.png

发现讲师介绍的@Column注解有一项nullable(能否为空)属性,默认为true,这里尝试着添加该注解,并将nullable属性设置为false,不可为空。测试

@ApiModelProperty("学科类别")
@ManyToOne
// 设置学科类别字段不能为空
@Column(nullable = false)
@JsonView({NoneJsonView.class,
        MeasurementUnitCategoryJsonView.getAllByDisciplineId.class})
private Discipline discipline;

异常

跑一下测试确保改这行代码整座桥不会塌。跑测试的时候却抛出了异常。spa

clipboard.png

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而不是@Columnip

@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,测试经过。

clipboard.png

相关文章
相关标签/搜索