Hibernateは@Column
アノテーションが付けられたクラス変数のみを考慮すると思いました。しかし奇妙なことに、変数を追加したとき(クラスに必要な変数だけです)、列名としてその変数をselectステートメントに含めようとしてエラーをスローします-
「フィールドリスト」の不明な列「team1_.agencyName」
私のクラス -
@Entity
@Table(name="team")
public class Team extends BaseObject implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(length=50)
private String name;
@Column(length=10)
private String code;
@Column(name = "agency_id")
private Long agencyId;
private String agencyName; //note: not annotated.
}
参考までに、多対多のマッピングを持つ別のクラスで上記のクラスを使用します
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name="user_team",
joinColumns = { @JoinColumn( name="user_id") },
inverseJoinColumns = @JoinColumn( name="team_id")
)
public Set<Team> getTeams() {
return teams;
}
なんでこんなことが起こっているの?!
JPAは、特に@Transient
でマークしない限り、クラスのallプロパティを使用します。
@Transient
private String agencyName;
@Column
アノテーションは純粋にオプションであり、自動生成された列名をオーバーライドできるようにするためにあります。さらに、@Column
のlength
属性は、テーブル定義の自動生成時にのみ使用され、ランタイムには影響しません。
検索エンジンを介してこの投稿を見つける人々にとって、この問題の別の考えられる原因は、@Transient
の誤ったパッケージバージョンをインポートすることです。他のパッケージではなく、javax.persistence.transient
をインポートしてください。
プライベートフィールドを持つゲッターに@Transient
を配置するとうまくいきました。
private String name;
@Transient
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}