web-dev-qa-db-ja.com

休止状態に、マッピングされていないクラス変数を無視させる

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;
}

なんでこんなことが起こっているの?!

183
hese

JPAは、特に@Transientでマークしない限り、クラスのallプロパティを使用します。

@Transient
private String agencyName;

@Columnアノテーションは純粋にオプションであり、自動生成された列名をオーバーライドできるようにするためにあります。さらに、@Columnlength属性は、テーブル定義の自動生成時にのみ使用され、ランタイムには影響しません。

381
skaffman

検索エンジンを介してこの投稿を見つける人々にとって、この問題の別の考えられる原因は、@Transientの誤ったパッケージバージョンをインポートすることです。他のパッケージではなく、javax.persistence.transientをインポートしてください。

78
CodeMed

プライベートフィールドを持つゲッターに@Transientを配置するとうまくいきました。

private String name;

    @Transient
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
27
Saumyaraj