让Hibernate忽略那些未映射的实例变量
让Hibernate忽略那些未映射的实例变量
我原以为 Hibernate 只考虑带有 @Column 注解的实例变量。但是今天很奇怪的是,当我添加了一个变量(它不映射到任何列,只是我在类中需要的一个变量)时,它试图将该变量作为列名包含在 select 语句中,并抛出以下错误:\n
\n\'field list\' 中的未知列 \'team1_.agencyName\'\n
\n我的类 -\n
@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; //注意:没有注解。 }
\nFYI...我在另一个类中使用上述类进行多对多映射\n
@ManyToMany(fetch = FetchType.EAGER) @JoinTable( name="user_team", joinColumns = { @JoinColumn( name="user_id") }, inverseJoinColumns = @JoinColumn( name="team_id") ) public SetgetTeams() { return teams; }
\n为什么会发生这种情况?!
问题:Make Hibernate ignore instance variables that are not mapped(让Hibernate忽略未映射的实例变量)。
原因:根据使用的库的不同,一些库对getter/setter上的注解存在限制,有些库不允许在属性和getter/setter之间混合使用注解。这可能导致Hibernate无法正确映射实例变量。
解决方法:在getter方法上使用@Transient
注解可以解决这个问题。下面是一个示例代码:
private String name; [apcode]@Transient
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
[/apcode]
此外,也可以在属性上使用
@Transient
注解来达到同样的效果。通过在getter方法或属性上使用
@Transient
注解,可以让Hibernate忽略未映射的实例变量。这样就可以解决一些库对注解的限制所导致的问题。
问题出现的原因是JPA会使用类的所有属性,除非你专门用@Transient
标记它们。这个注解是可选的,它用于让你可以覆盖自动生成的列名。此外,@Column
的length
属性仅在自动生成表定义时使用,对运行时没有影响。你也可以使用Java修饰符transient
代替注解。
解决方法是在不需要持久化的属性上使用@Transient
注解或transient
修饰符。这样,Hibernate将忽略这些属性,不会将它们映射到数据库表中。这样做可以避免不必要的数据库操作和额外的存储空间。
但是,如果你希望在从数据库中获取数据时也考虑这些字段,只在持久化时忽略它们,那么需要另一种解决方法。
可以使用Hibernate的@Formula
注解来指定一个计算公式,以忽略不需要持久化的属性。这个公式可以是一个SQL表达式或一个Hibernate的查询语言查询。通过这种方式,你可以在从数据库中获取数据时考虑这些字段,但在持久化时忽略它们。
下面是一个示例代码:
@Column(name = "agency_name") private String agencyName; @Transient private String transientField; @Column(name = "full_name") @Formula("concat(first_name, ' ', last_name)") private String fullName;
在这个示例中,agencyName
属性将被映射到数据库表的agency_name
列,transientField
属性将被忽略,fullName
属性将使用concat(first_name, ' ', last_name)
作为计算公式,将其值从first_name
和last_name
属性中合并而来。
通过使用@Formula
注解,可以灵活地控制Hibernate如何处理不需要持久化的属性,以满足特定的需求。