package org.hibernate.bugs;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* This template demonstrates how to develop a test case for Hibernate ORM, using the Java Persistence API.
*/
public class JPAUnitTestCase {
private EntityManagerFactory entityManagerFactory;
@Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("templatePU");
}
@After
public void destroy() {
entityManagerFactory.close();
}
@Test
public void hhh123Test() throws Exception {
EntityManager entityManager = entityManagerFactory.createEntityManager();
runInTransaction(entityManager, () -> {
Parent parent1 = new Parent(1);
new Child(3, parent1);
entityManager.persist(parent1);
Parent parent2 = new Parent(2);
entityManager.persist(parent2);
});
runInTransaction(entityManager, () -> {
Query query = entityManager.createQuery("from Parent p where p.child is null");
@SuppressWarnings("unchecked")
List<Parent> parents = query.getResultList();
assertThat(parents).hasSize(1);
assertThat(parents).element(0).extracting(Parent::getId).isEqualTo(2);
});
entityManager.close();
}
private void runInTransaction(EntityManager entityManager, Runnable runnable) {
entityManager.getTransaction().begin();
runnable.run();
entityManager.getTransaction().commit();
entityManager.clear();
}
}
@Entity
class Parent {
@Id
private long id;
@OneToOne(mappedBy = "parent", cascade = CascadeType.ALL)
private Child child;
Parent() {}
public Parent(long id) {
this.id = id;
}
public long getId() {
return id;
}
public Child getChild() {
return child;
}
void setChild(Child child) {
this.child = child;
}
@Override
public String toString() {
return "Parent [id=" + id + ", child=" + child + "]";
}
}
@Entity
class Child {
@Id
private long id;
@OneToOne
private Parent parent;
Child() {}
public Child(long id, Parent parent) {
this.id = id;
setParent(parent);
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
parent.setChild(this);
}
@Override
public String toString() {
return "Child [id=" + id + "]";
}
}