如何从Hibernate EntityManager正确分离实体

时间:2018-12-17 22:38:28

标签: java hibernate jpa

我想稍微测试一下JPA,所以我创建了以下类User

@Entity
@Table(name="USER")
public class User {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="user")
    private int user_id;

    @Column(name="firstname")
    private String firstname;

    @Column(name="lastname")
    private String lastname;

    protected User() {
    }

    public User(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }
    //getters and setters
}

现在,我获得了以下测试课程:

@RunWith(SpringRunner.class)
@DataJpaTest
public class AssignmentTest {
    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private UserRepository userRepository;

    @Test
    public void whenFindByName_thenReturnUser() {
        //given
        User user = new User("Firstname", "Lastname");
        entityManager.persist(user);
        entityManager.flush();

        //when
        User found = userRepository.findUsersByLastname(user.getLastname()).get(0);

        entityManager.detach(user);
        user.setLastname("Boohoo");

        //then
        assertThat(found.getLastname())
            .isEqualTo("Lastname");
    }
}

现在,我希望EntityManager停止更改我的实体的值。我读了几则帖子,告诉他们使用detachremoveclear-没有一个可行的方法。我仍然可以(在试运行中):

 org.junit.ComparisonFailure: expected:<"[Lastname]"> but was:<"[Boohoo]">

我试图查看Hibernate正在执行的语句,但是我看不到hibernate将执行update语句。

我在这方面做错了什么?

1 个答案:

答案 0 :(得分:0)

在您的示例中,userfound指向同一对象

首先,您在user上调用persist,这意味着user引用的对象成为托管实体。然后,您致电:

User found = userRepository.findUsersByLastname(user.getLastname()).get(0);

,并且由于与查询条件匹配的User已存在于持久性上下文中,因此将返回对该对象(以前是持久性的)的引用。

调用entityManager.detach(user) 确实分离user所引用的实体。此时found只是引用了相同的对象。