带注释的Hibernate表映射

时间:2011-05-21 23:15:34

标签: java hibernate hql

我刚刚开始使用Spring / Hibernate,我正在尝试了解hibernate如何将实体映射到表。现在我正在使用以下类来测试使用hibernate的CRUD操作:

@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查询?

2 个答案:

答案 0 :(得分:1)

当您编写HQL时,您正在查询OO模型。因此,在这种情况下,使用您的类名UserEntity。但是,hibernate会将其转换为本机SQL查询,因此在日志中您将看到对users表的引用。我不确定你的问题是什么。如果类名是UserEntity,那么在整个应用程序中,您应该使用UserEntity。我认为只有在HQL没有达到你想要的效果时才需要进入本机SQL。

答案 1 :(得分:1)

文森特解释了这个问题,我只想补充一些说明。

@Table注释是可选的,仅指示基础表是什么(默认情况下它与实体名称相同(通过转换机制)。

但是hibernate(和orm层)的想法是让开发人员编写代码而不引用任何底层关系模型。这就是你应该尝试做的事情 - “忘记”下面的关系模型,只使用对象模型。