我刚刚开始使用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查询?
答案 0 :(得分:1)
当您编写HQL时,您正在查询OO模型。因此,在这种情况下,使用您的类名UserEntity。但是,hibernate会将其转换为本机SQL查询,因此在日志中您将看到对users表的引用。我不确定你的问题是什么。如果类名是UserEntity,那么在整个应用程序中,您应该使用UserEntity。我认为只有在HQL没有达到你想要的效果时才需要进入本机SQL。
答案 1 :(得分:1)
文森特解释了这个问题,我只想补充一些说明。
@Table
注释是可选的,仅指示基础表是什么(默认情况下它与实体名称相同(通过转换机制)。
但是hibernate(和orm层)的想法是让开发人员编写代码而不引用任何底层关系模型。这就是你应该尝试做的事情 - “忘记”下面的关系模型,只使用对象模型。