使hibernate忽略未映射的类变量

时间:2011-01-11 20:59:05

标签: java hibernate jpa

我认为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;
}

为什么会发生这种情况?!

3 个答案:

答案 0 :(得分:378)

JPA将使用该类的所有属性,除非您使用@Transient专门标记它们:

@Transient
private String agencyName;

@Column注释纯粹是可选的,可以让您覆盖自动生成的列名。此外,length的{​​{1}}属性仅在自动生成表定义时使用,它对运行时没有影响。

答案 1 :(得分:77)

对于通过搜索引擎发现此帖子的人,导致此问题的另一个可能原因是导入错误的包版本@Transient。确保导入javax.persistence.transient而不是其他包。

答案 2 :(得分:27)

@MyAnno放置在具有私有字段的getter上为我工作。

@Transient