使hibernate忽略未映射的类变量

hes*_*ese 188 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.

}
Run Code Online (Sandbox Code Playgroud)

仅供参考...我在另一个具有多对多映射的类中使用上面的类

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(
        name="user_team",
        joinColumns = { @JoinColumn( name="user_id") },
        inverseJoinColumns = @JoinColumn( name="team_id")
)    
public Set<Team> getTeams() {
    return teams;
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?!

ska*_*man 397

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

@Transient
private String agencyName;
Run Code Online (Sandbox Code Playgroud)

@Column注释纯粹是可选的,并且是有让你忽略自动生成的列名.此外,length属性@Column 仅在自动生成表定义时使用,它对运行时没有影响.


Cod*_*Med 82

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

  • 谢谢,正在使用org.springframework.data.annotation.Transient并且很困惑为什么它不起作用. (2认同)

Sau*_*raj 27

放置@Transient在吸气与私人领域为我工作.

private String name;

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

    public void setName(String name) {
        this.name = name;
    }
Run Code Online (Sandbox Code Playgroud)

  • @ADTC取决于所使用的库,有些人对getter/setter上的注释保持警惕,有些则不这样做(最近注意到了Moxy和Jackson; Moxy非常棒,因为它没有理由无声地失败),有些人不喜欢它们混合(两者之间)属性和getter/setter).一定要喜欢它. (3认同)