HHH-18032 Add test for issue
This commit is contained in:
parent
f7708d59ac
commit
480e09fc4c
|
@ -0,0 +1,234 @@
|
||||||
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.Fetch;
|
||||||
|
import org.hibernate.annotations.FetchMode;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.JiraKey;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import jakarta.persistence.CascadeType;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.FetchType;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.IdClass;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.JoinColumns;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.OneToMany;
|
||||||
|
import jakarta.persistence.PrePersist;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||||
|
|
||||||
|
|
||||||
|
@Jpa(
|
||||||
|
annotatedClasses = {
|
||||||
|
PrePersistAndCompositeIdTest.Parent.class,
|
||||||
|
PrePersistAndCompositeIdTest.Child.class,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@JiraKey("HHH-18032")
|
||||||
|
public class PrePersistAndCompositeIdTest {
|
||||||
|
|
||||||
|
private static final Long PARENT_ID1 = 1L;
|
||||||
|
private static final Long PARENT_ID2 = 2L;
|
||||||
|
private static final Long PARENT_ID_2_2 = 3L;
|
||||||
|
|
||||||
|
|
||||||
|
private static final Long CHILD_ID1 = 3L;
|
||||||
|
private static final Long CHILD_ID2 = 4L;
|
||||||
|
private static final Long CHILD_ID_2_2 = 5L;
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void tearDown(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
entityManager.createQuery( "delete from Child" ).executeUpdate();
|
||||||
|
entityManager.createQuery( "delete from Parent" ).executeUpdate();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMerge(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Child child = new Child( CHILD_ID1, null, "child" );
|
||||||
|
Child merged = entityManager.merge( child );
|
||||||
|
Parent parent = new Parent( PARENT_ID1, null, "parent", merged );
|
||||||
|
entityManager.merge( parent );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Parent parent = session.find( Parent.class, new CompositeId( PARENT_ID1, PARENT_ID2 ) );
|
||||||
|
assertThat( parent ).isNotNull();
|
||||||
|
assertThat( parent.getChildren().size() ).isEqualTo( 1 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersist(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Child child = new Child( CHILD_ID1, null, "child" );
|
||||||
|
entityManager.persist( child );
|
||||||
|
Parent parent = new Parent( PARENT_ID1, null, "parent", child );
|
||||||
|
entityManager.persist( parent );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Parent parent = session.find( Parent.class, new CompositeId( PARENT_ID1, PARENT_ID2 ) );
|
||||||
|
assertThat( parent ).isNotNull();
|
||||||
|
assertThat( parent.getChildren().size() ).isEqualTo( 1 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMergeAssignBothId(EntityManagerFactoryScope scope) {
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Child child = new Child( CHILD_ID1, CHILD_ID_2_2, "child" );
|
||||||
|
Child merged = entityManager.merge( child );
|
||||||
|
Parent parent = new Parent( PARENT_ID1, PARENT_ID_2_2, "parent", merged );
|
||||||
|
entityManager.merge( parent );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Parent parent = session.find( Parent.class, new CompositeId( PARENT_ID1, PARENT_ID_2_2 ) );
|
||||||
|
assertThat( parent ).isNotNull();
|
||||||
|
assertThat( parent.getChildren().size() ).isEqualTo( 1 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersistAssignBothId(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Child child = new Child( CHILD_ID1, CHILD_ID_2_2, "child" );
|
||||||
|
entityManager.persist( child );
|
||||||
|
Parent parent = new Parent( PARENT_ID1, PARENT_ID_2_2, "parent", child );
|
||||||
|
entityManager.persist( parent );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Parent parent = session.find( Parent.class, new CompositeId( PARENT_ID1, PARENT_ID_2_2 ) );
|
||||||
|
assertThat( parent ).isNotNull();
|
||||||
|
assertThat( parent.getChildren().size() ).isEqualTo( 1 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Parent")
|
||||||
|
@IdClass(CompositeId.class)
|
||||||
|
public static class Parent {
|
||||||
|
@Id
|
||||||
|
private Long id1;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long id2;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||||
|
@Fetch(FetchMode.SELECT)
|
||||||
|
List<Child> children = new ArrayList<>();
|
||||||
|
|
||||||
|
public Parent() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Parent(Long id1, Long id2, String name, Child child) {
|
||||||
|
this.id1 = id1;
|
||||||
|
this.id2 = id2;
|
||||||
|
this.name = name;
|
||||||
|
this.children.add( child );
|
||||||
|
child.parent = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PrePersist
|
||||||
|
public void prePersist() {
|
||||||
|
if ( id2 == null ) {
|
||||||
|
id2 = PARENT_ID2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId1() {
|
||||||
|
return id1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId2() {
|
||||||
|
return id2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Child> getChildren() {
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Child")
|
||||||
|
@IdClass(CompositeId.class)
|
||||||
|
public static class Child {
|
||||||
|
@Id
|
||||||
|
private Long id1;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long id2;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumns({
|
||||||
|
@JoinColumn(name = "parent_id1", referencedColumnName = "id1"),
|
||||||
|
@JoinColumn(name = "parent_id2", referencedColumnName = "id2")
|
||||||
|
})
|
||||||
|
private Parent parent;
|
||||||
|
|
||||||
|
public Child() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Child(Long id1, Long id2, String name) {
|
||||||
|
this.id1 = id1;
|
||||||
|
this.id2 = id2;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PrePersist
|
||||||
|
public void prePersist() {
|
||||||
|
if ( id2 == null ) {
|
||||||
|
id2 = CHILD_ID2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CompositeId {
|
||||||
|
private Long id1;
|
||||||
|
|
||||||
|
private Long id2;
|
||||||
|
|
||||||
|
public CompositeId() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositeId(Long id1, Long id2) {
|
||||||
|
this.id1 = id1;
|
||||||
|
this.id2 = id2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue