2016-08-02 426 views
0

目前我剛開始使用Hibernate。我有點困惑,爲什麼@Column註釋不適用於getter。根據我所知,它適用於領域和getter,但不適用於setter。我究竟做錯了什麼?@Column註解不起作用

@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"追加到它的價值..

這裏我的主類:

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(); 
} 

回答

0

據我知道你需要設置hibernate.cfg config來告訴休眠所有屬性,如數據源和映射。在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> 
0

你面對的是通過在混合接入模式引起的問題同一個實體。如果你想混合接入模式,你必須做以下步驟:

  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 private String userName; 
    
  • 注意:如果沒有合理的理由使用混合模式,則應堅持使用字段訪問模式或屬性訪問模式;不要在實體中使用這兩種模式,因爲您想編寫簡潔易懂的代碼! (我的個人意見)

    而就在你的下面的代碼行的最後一個評論:

    @Entity (name="USER_DETAILS") 
    

    如果你使用name屬性特意命名的實體它可能不是一個問題;但如果您試圖將實體映射到名爲USER_DETAILS的表,這不是正確的方法;改爲使用以下內容:

    @Table(name = "USER_DETAILS")