我以为hibernate只考虑用@Column注释的实例变量。但奇怪的是,今天当我添加一个变量(它没有映射到任何列,只是一个变量,我需要在类),它试图包括该变量在选择语句作为列名,并抛出错误-

未知列“team1_”。字段列表中的代理名

我的班级——

@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标记它们:

@Transient
private String agencyName;

@Column注释完全是可选的,它允许您重写自动生成的列名。此外,@Column的length属性仅在自动生成表定义时使用,它对运行时没有影响。


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


将@Transient放在具有私有字段的getter上对我有用。

    private String name;

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

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