@Column注释不起作用

时间:2016-08-02 19:10:35

标签: java hibernate

目前我刚刚开始使用Hibernate。我很困惑为什么@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; } } 注释不适用于getter。据我所知,它适用于字段和getter但不适用于setter。我做错了什么?

userName

数据库中的"from name getter"列更改和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(); } 都不会附加到其值中。

这是我的主要课程:

nosetests

3 个答案:

答案 0 :(得分:1)

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

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

    @Entity
    @Access(AccessType.FIELD)
    public class UserDetails { ...}
    
  2. 使用此设置,默认访问模式将设置为字段访问。如果不这样做并注释字段以及带有映射注释的属性(例如@Column),则不会定义行为。

    1. 现在明确注释属性访问的getter方法(即告诉持久性提供程序我已将我的默认定义为字段访问,但在这种情况下我想使用属性访问):

      @Access(AccessType.PROPERTY)
      @Column (name="USER_NAME")
      public String getUserName() {
          return userName+" from name getter";
      }
      
    2. 最后,使用@Transient注释将相应字段标记为瞬态,以便提供者不会尝试使用该字段以及属性来保持状态:

      @Transient private String userName;
      
    3. 注意:如果没有合理的理由使用混合模式,您应该坚持使用字段访问模式或属性访问模式;不要在实体中使用这两种模式,因为你想编写干净且易于理解的代码! (我的个人意见)

      最后一条评论代码中的以下行:

      @Entity (name="USER_DETAILS")
      

      如果您故意使用name属性来命名实体,那么它可能不是问题;但是如果你试图将实体映射到名为USER_DETAILS的表,这不是正确的方法;而是使用以下内容:

      @Table(name = "USER_DETAILS")
      

答案 1 :(得分:0)

据我所知,您需要设置hibernate.cfg配置来告诉hibernate所有属性,例如数据源和映射。在main方法的开头配置如下:

   Configuration config = new Configuration().configure("hibernate.cfg.xml"); 
   StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder();
   srb.applySettings(config.getProperties());
   ServiceRegistry registry = srb.build();
   SessionFactory sessionFactory = config.buildSessionFactory(registry);

您的cfg.xml文件类似于:

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>
        <property name="hibernate.connection.driver_class">YOUR_DRIVER</property>
        <property name="hibernate.connection.username">YOUR_USER</property>
        <property name="hibernate.connection.password">YOUR_PASSWPRD</property>
        <property name="hibernate.connection.url"> YOUR_URL </property>
        <property name="hibernate.dialect">SET_YOUR_DIALECT</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- Map Entity Class -->
    <mapping class="entity.UserDetails"></mapping>

</session-factory>
</hibernate-configuration>

答案 2 :(得分:0)

我在使用 @Column(unique=true) 时遇到了同样的问题,我在 application.properties 上添加了它,它对我有用。

resources/application.properties

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl