让Hibernate忽略那些未映射的实例变量

8 浏览
0 Comments

让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 Set getTeams() {
    return teams;
}

\n为什么会发生这种情况?!

0
0 Comments

问题: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忽略未映射的实例变量。这样就可以解决一些库对注解的限制所导致的问题。

0
0 Comments

出现问题的原因:导入了错误的包版本,应该导入javax.persistence.transient而不是其他包。

解决方法:确保导入正确的包版本javax.persistence.transient

0
0 Comments

问题出现的原因是JPA会使用类的所有属性,除非你专门用@Transient标记它们。这个注解是可选的,它用于让你可以覆盖自动生成的列名。此外,@Columnlength属性仅在自动生成表定义时使用,对运行时没有影响。你也可以使用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_namelast_name属性中合并而来。

通过使用@Formula注解,可以灵活地控制Hibernate如何处理不需要持久化的属性,以满足特定的需求。

0