Как правильно отсоединить сущность от Hibernate EntityManager - PullRequest
0 голосов
/ 18 декабря 2018

Я хотел немного протестировать 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 прекратил изменять значение моего Entity.Я прочитал несколько постов, в которых говорилось использовать detach, remove или clear - ничего из этого не получилось.Я все еще получаю (при тестовом прогоне):

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

Я пытался разобраться в инструкциях, которые выполняет Hibernate, но я не вижу, чтобы hibernate выполнил update -условие.

Что я сделал не так на этом?

1 Ответ

0 голосов
/ 18 декабря 2018

В вашем примере user и found указывают на один и тот же объект .

Сначала вы вызываете persist для user, что означает, что объект, на который ссылается user, становится управляемым объектом.Затем вы вызываете:

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

и, поскольку User, который соответствует критериям запроса, уже присутствует в контексте постоянства, возвращается ссылка на этот (ранее сохраненный) объект.

Вызов entityManager.detach(user) действительно отсоединяет сущность, на которую ссылается user.Просто found ссылается на тот же объект на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...