这个问题在这里已经有了答案:在持久化期间忽略 JPA 字段的最简单方法是什么? (10 个回答) 6 年前关闭。
我认为 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;
}
为什么会这样?!
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;
}
@Transient
没有区别吗?
不定期副业成功案例分享
transient
代替注解import javax.persistence.Transient;