java - @Column注解不起作用

标签 java hibernate

目前我刚刚开始使用 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();
}

最佳答案

您面临的问题是由同一实体中的混合访问模式引起的。如果您想混合访问模式,您必须执行以下步骤:

  1. 定义默认访问模式如下:

    @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/

    相关文章:

    Java Web App - 打印时隐藏打印对话框

    java - 背包 - 优先级最低,重量最小

    java - 有没有办法打包jar依赖项以便在独立环境中运行java类

    与 "elements()"等效的 Hibernate Criteria API

    java - 使用 TransferHandler 拖动 JLabel(拖放)

    java - 无法使用 Jack 编译器运行项目

    java - 使用 Hibernate 中的条件按月分组

    mysql - 如何使用 hibernate.default_schema 和 hibernate.default_catalog

    java - 达到 max_size 时 c3p0 不释放连接

    java - Hibernate:惰性初始化与损坏的哈希码/等于难题