我想稍微测试一下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停止更改我的实体的值。我读了几则帖子,告诉他们使用detach
,remove
或clear
-没有一个可行的方法。我仍然可以(在试运行中):
org.junit.ComparisonFailure: expected:<"[Lastname]"> but was:<"[Boohoo]">
我试图查看Hibernate正在执行的语句,但是我看不到hibernate将执行update
语句。
我在这方面做错了什么?
答案 0 :(得分:0)
在您的示例中,user
和found
指向同一对象。
首先,您在user
上调用persist,这意味着user
引用的对象成为托管实体。然后,您致电:
User found = userRepository.findUsersByLastname(user.getLastname()).get(0);
,并且由于与查询条件匹配的User
已存在于持久性上下文中,因此将返回对该对象(以前是持久性的)的引用。
调用entityManager.detach(user)
确实分离user
所引用的实体。此时found
只是引用了相同的对象。