目前我刚刚开始使用 Hibernate。我有点困惑为什么 @Column 注释不适用于 getter。据我所知,它适用于字段和 getter,但不适用于 setter。我做错了什么?
@Entity (name="USER_DETAILS")
public class UserDetails {
@Id
private int userId;
private String userName;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Column (name="USER_NAME")
public String getUserName() {
return userName + " from name getter";
}
public void setUserName(String userName) {
this.userName = userName;
}
}
数据库中的userName
列更改和“from name getter”
都不会追加到其值中。
这是我的主要类(class):
public static void main(String[] args) {
// TODO Auto-generated method stub
UserDetails user=new UserDetails();
user.setUserId(1);
user.setUserName("First User");
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
session.close();
}
最佳答案
您面临的问题是由同一实体中的混合访问模式引起的。如果您想混合访问模式,您必须执行以下步骤:
定义默认访问模式如下:
@Entity @Access(AccessType.FIELD) public class UserDetails { ...}
通过此设置,默认访问模式将设置为字段访问。如果您不这样做并使用映射注释(例如@Column)来注释字段和属性,则不会定义行为。
现在显式注释属性访问的 getter 方法(即告诉持久性提供者我已将默认值定义为字段访问,但在本例中我想使用属性访问):
@Access(AccessType.PROPERTY) @Column (name="USER_NAME") public String getUserName() { return userName+" from name getter"; }
最后,使用 @Transient 注释将相应的字段标记为 transient ,以便提供者不会尝试使用该字段以及属性来持久保存状态:
@Transient private String userName;
注意:如果没有充分的理由使用混合模式,您应该坚持使用字段访问模式或属性访问模式;不要在实体中使用这两种模式,因为您想编写干净且易于理解的代码! (个人观点)
最后对代码中的以下行进行评论:
@Entity (name="USER_DETAILS")
如果您故意使用 name
属性来命名实体,这可能不是问题;但如果您尝试将实体映射到名为 USER_DETAILS 的表,这不是正确的方法;而是使用以下内容:
@Table(name = "USER_DETAILS")
关于java - @Column注解不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38728671/