註解異常 @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

相關文章
相關標籤/搜索