BAEL-4565 Object States in Hibernate's Session (#10107)
This commit is contained in:
parent
502a128c91
commit
53609d6594
|
@ -0,0 +1,12 @@
|
||||||
|
package com.baeldung.states;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class Application {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(Application.class, args);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.baeldung.states;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class UserEntity {
|
||||||
|
@Id
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
private UserEntity manager;
|
||||||
|
|
||||||
|
public UserEntity(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.baeldung.states;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class UserEntityWithCascade {
|
||||||
|
@Id
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ManyToOne(cascade = CascadeType.PERSIST)
|
||||||
|
private UserEntityWithCascade manager;
|
||||||
|
|
||||||
|
public UserEntityWithCascade(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,136 @@
|
||||||
|
package com.baeldung.states;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.SessionFactory;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest
|
||||||
|
class UserEntityIntegrationTest {
|
||||||
|
@Autowired
|
||||||
|
private EntityManagerFactory entityManagerFactory;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenName_thenShouldCreateDetachedUserEntity() {
|
||||||
|
// given
|
||||||
|
Session session = openSession();
|
||||||
|
UserEntity userEntity = new UserEntity("John");
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(session.contains(userEntity)).isFalse();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenName_whenPersisted_thenShouldCreatePersistentUserEntity() {
|
||||||
|
// given
|
||||||
|
Session session = openSession();
|
||||||
|
UserEntity userEntity = new UserEntity("John");
|
||||||
|
|
||||||
|
// when
|
||||||
|
session.persist(userEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(session.contains(userEntity)).isTrue();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPersistentEntity_whenSessionClosed_thenShouldDetachEntity() {
|
||||||
|
// given
|
||||||
|
Session session = openSession();
|
||||||
|
UserEntity userEntity = new UserEntity("John");
|
||||||
|
session.persist(userEntity);
|
||||||
|
assertThat(session.contains(userEntity)).isTrue();
|
||||||
|
|
||||||
|
// when
|
||||||
|
session.close();
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(session.isOpen()).isFalse();
|
||||||
|
assertThatThrownBy(() -> session.contains(userEntity));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPersistentEntity_whenAddedTransientManager_thenShouldThrowException() {
|
||||||
|
// given
|
||||||
|
Session session = openSession();
|
||||||
|
Transaction transaction = session.beginTransaction();
|
||||||
|
UserEntity userEntity = new UserEntity("John");
|
||||||
|
session.persist(userEntity);
|
||||||
|
UserEntity manager = new UserEntity("Adam");
|
||||||
|
|
||||||
|
// when
|
||||||
|
userEntity.setManager(manager);
|
||||||
|
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThatThrownBy(() -> {
|
||||||
|
session.saveOrUpdate(userEntity);
|
||||||
|
transaction.commit();
|
||||||
|
});
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPersistentEntity_whenAddedPersistentManager_thenShouldSave() {
|
||||||
|
// given
|
||||||
|
Session session = openSession();
|
||||||
|
Transaction transaction = session.beginTransaction();
|
||||||
|
UserEntity userEntity = new UserEntity("John");
|
||||||
|
session.persist(userEntity);
|
||||||
|
UserEntity manager = new UserEntity("Adam");
|
||||||
|
session.persist(manager);
|
||||||
|
|
||||||
|
// when
|
||||||
|
userEntity.setManager(manager);
|
||||||
|
|
||||||
|
|
||||||
|
// then
|
||||||
|
session.saveOrUpdate(userEntity);
|
||||||
|
transaction.commit();
|
||||||
|
session.close();
|
||||||
|
|
||||||
|
Session otherSession = openSession();
|
||||||
|
UserEntity savedUser = otherSession.get(UserEntity.class, "John");
|
||||||
|
assertThat(savedUser.getManager().getName()).isEqualTo("Adam");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenPersistentEntityWithCascade_whenAddedTransientManager_thenShouldSave() {
|
||||||
|
// given
|
||||||
|
Session session = openSession();
|
||||||
|
Transaction transaction = session.beginTransaction();
|
||||||
|
UserEntityWithCascade userEntity = new UserEntityWithCascade("John");
|
||||||
|
session.persist(userEntity);
|
||||||
|
UserEntityWithCascade manager = new UserEntityWithCascade("Adam");
|
||||||
|
|
||||||
|
// when
|
||||||
|
userEntity.setManager(manager);
|
||||||
|
|
||||||
|
|
||||||
|
// then
|
||||||
|
session.saveOrUpdate(userEntity);
|
||||||
|
transaction.commit();
|
||||||
|
session.close();
|
||||||
|
|
||||||
|
Session otherSession = openSession();
|
||||||
|
UserEntityWithCascade savedUser = otherSession.get(UserEntityWithCascade.class, "John");
|
||||||
|
assertThat(savedUser.getManager().getName()).isEqualTo("Adam");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Session openSession() {
|
||||||
|
return entityManagerFactory.unwrap(SessionFactory.class).openSession();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue