2011-05-21 202 views
3

我剛剛開始使用Spring/Hibernate,並試圖瞭解hibernate如何將實體映射到表。現在,我有以下類的工作與休眠來測試CRUD操作:帶註釋的Hibernate表映射

@Entity 
@Table(name = "Users") 
public class UserEntity implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    private String firstName; 
    private String lastName; 
    private int age; 

    //Getters, setters, etc. 
} 


@Repository 
public class UserDAOImpl implements UserDAO { 
    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @Override 
    public UserEntity getUser(String firstName, String lastName) { 
     List<UserEntity> users = hibernateTemplate.find("from UserEntity u where u.firstName = ? and u.lastName = ?", firstName, lastName); 
     return (users.size() == 0 ? null : users.get(0)); 
    } 

    @Override 
    public void saveOrUpdate(UserEntity user) { 
     hibernateTemplate.saveOrUpdate(user); 
    } 
} 

上面的代碼工作正常,但我很困惑UserEntity如何被映射到表。更具體地講,調用hibernateTemplate.find("from UserEntity u where u.firstName = ? and u.lastName = ?", firstName, lastName)當我在日誌中得到以下信息:

Hibernate: select userentity0_.id as id0_, userentity0_.age as age0_, userentity0_.firstName as firstName0_, userentity0_.lastName as lastName0_ from Users userentity0_ where userentity0_.firstName=? and userentity0_.lastName=?

當調用hibernateTemplate.find()我需要指定表UserEntity而日誌報告它的查詢表用戶(正如我用@Table註解指定的那樣)。

理想情況下,我想在整個我的程序一致,指的是UserEntity表作爲用戶而不是UserEntity。有什麼辦法可以做到這一點?如果可以,我可以使用HQL來完成,還是需要編寫原生SQL查詢?

回答

1

當您編寫HQL時,您正在查詢OO模型。所以在這種情況下,您的類名UserEntity被使用。但是,hibernate會將其轉換爲本地SQL查詢,因此在日誌中您將看到對用戶表的引用。我不確定你的問題是什麼。如果類名是UserEntity,那麼在你的應用程序中你應該使用UserEntity。我認爲進入本機SQL只有當HQL沒有做到你想要的時候才需要。

+0

感謝您的輸入。我認爲我對HQL的不熟悉是造成混淆的根源,我希望使用@Table註釋定義的表名,但這是一個很小的區別。 – BBBronto 2011-05-22 00:23:56

1

文森特解釋了這件事,我只是補充一些說明。

@Table註釋是可選的,僅表示基礎表是什麼(默認情況下它是一樣的實體名稱(通過轉換機制)。

但休眠(和ORM層的想法)是讓開發人員編寫代碼而不涉及任何底層關係模型,而這就是你應該嘗試去做的事 - 「忘記」下面的關係模型,只使用對象模型