Spring-Data-Jpa 中的实体管理器和映射
如果我的文章对您产生了帮助,我将非常开心,欢迎关注我的Github,欢迎访问我的博客,欢迎star。
实体管理器
实体状态
- 临时状态:
对象刚创建出来的状态,实际上就是new了一个普通的实体。
- 托管状态
临时状态的实体在调用persist()方法后,实体状态改变为托管状态,该实体的任何属性改动都会导致数据库记录的改动。
- 持久化状态
托管状态的实体被管理器flush了,那么就在极短暂的时间进入了持久化状态,事务提交之后,立刻变为了游离状态。
您可以把持久化状态当做实实在在的数据库记录。
- 游离状态
持久化状态的实体被commit到数据库后,实体状态变为游离态,因为事务已经提交了,此时实体的属性任你如何改变,也不会同步到数据库,此时实体不在持久化上下文中。
- 销毁状态
一般要删除一个持久化对象的时候都是先find出来,之后调用remove方法删除,此时这个对象就是销毁状态。
实体状态和转换
[外链图片转存失败(img-3f2KOPIa-1564015139263)(/img/java-spring-data-jpa/1-1.png)]
建立实现类来使用EntityManager自定义方法
首先创建一个User实体类,然后创建UserRepository,自己创建一个相对应的实现类UserRepositoryImpl,注意命名规范。
User.java
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer departmentId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Integer getDepartmentId() {
return departmentId;
}
public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
}
}
UserRepository.java
public interface UserRepository extends JpaRepository<User, Integer> {
void add(User user);
User update(User user);
User addOrUpdate(User user);
void delete(User user);
User findOne(Integer id);
@Override
List<User> findAll();
}
UserRepositoryImpl.java
public class UserRepositoryImpl {
@PersistenceContext
private EntityManager entityManager;
@Transactional
public void add(User user){
entityManager.persist(user);
}
@Transactional
public User update(User user){
User userUpdate = entityManager.find(User.class, user);
userUpdate.setId(user.getId());
userUpdate.setDepartmentId(user.getDepartmentId());
userUpdate.setName(user.getName());
return userUpdate;
}