2011-05-21 113 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层的想法)是让开发人员编写代码而不涉及任何底层关系模型,而这就是你应该尝试去做的事 - “忘记”下面的关系模型,只使用对象模型