一旦将对象持久化到数据库中,它就会产生一个主键,我们可以通过这个主键来查询它。查询的方法很简单,只需要指定要查询的id和查询后对象的实体类,就可以取得该记录的实例。如下所示:
- Object obj = em.find(cls, id);
其中cls为实体Bean的类名。如果传递进find()方法的类参数不是实体Bean,则会引发Illegal- ArgumentException异常。除了find()以外,还有一个方法getReference(),用法与find()方法相同,不同的是当数据库中没有找到记录时,该方法将会抛出javax.persistence.EntityNotFoundException异常。
例如下面我们查找id为1的实体对象:
- try {
- Student student = em.find(Student.class, 1);
- System.out.println(student.getName());
- } catch (Exception e) {
- e.printStackTrace();
- }
当在数据库中没有找到记录时,find()方法会返回null。
以上的代码等价于执行了下面的SQL语句:
- select * from student where id=1;
当需要删除一个已经被持久化到数据库中的实体对象时,可以使用下面的方法来删除它:
- Object obj = em.find(cls, id);
- em.remove(obj);
例如下面我们删除id为1的对象:
- try {
- Student student = em.find(Student.class, 1);
- em.remove(student);
- } catch (Exception e) {
- e.printStackTrace();
- }
以上的代码等价于执行了下面的SQL语句:
- delete from student where id=1;
如果传递进remove()方法的参数不是实体Bean,则会引发一个IllegalArgumentException异常。
更新一个已经被持久化的实体对象,使用的方法如下:
- Object updatedObj = em.merge(obj);
例如我们将id为1的学生的姓名更改为"liuzhongbing":
- try {
- Student student = em.find(Student.class, 1);
- student.setName("liuzhongbing");
- em.merge(student);
- } catch (Exception e) {
- e.printStackTrace();
- }
以上的代码等价于执行了下面的SQL语句:
- update student set name="liuzhongbing" where id=1;
当执行em.merge(student)方法时,有如下两个执行规则:
如果此时容器中已经存在一个受容器管理的具有相同id的student实例,则容器将会把参数student的内容复制进这个受管理的实例,merge()方法返回受管理的实例,但参数student仍然是分离的、不受管理的。容器在决定Flush时把实例同步到数据库中。
容器中不存在具有相同id的student实例。容器根据传进的student参数复制出一个受容器管理的student实例,同时merge()方法会返回出这个受管理的实例,但参数student仍然是分离的、不受管理的。容器在决定Flush时把实例同步到数据库中。
如果传递进merge()方法的参数不是实体Bean,则会引发一个IllegalArgumentException异常。