我认为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;
}
为什么会发生这种情况?!
答案 0 :(得分:378)
JPA将使用该类的所有属性,除非您使用@Transient
专门标记它们:
@Transient
private String agencyName;
@Column
注释纯粹是可选的,可以让您覆盖自动生成的列名。此外,length
的{{1}}属性仅在自动生成表定义时使用,它对运行时没有影响。
答案 1 :(得分:77)
对于通过搜索引擎发现此帖子的人,导致此问题的另一个可能原因是导入错误的包版本@Transient
。确保导入javax.persistence.transient
而不是其他包。
答案 2 :(得分:27)
将@MyAnno
放置在具有私有字段的getter上为我工作。
@Transient