HHH-16997 Add test for issue
This commit is contained in:
parent
f1fe32f3e1
commit
761e9b7a00
|
@ -0,0 +1,372 @@
|
|||
package org.hibernate.orm.test.embeddable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.JiraKey;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Embeddable;
|
||||
import jakarta.persistence.Embedded;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.OneToOne;
|
||||
import jakarta.persistence.Table;
|
||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||
import jakarta.persistence.criteria.CriteriaQuery;
|
||||
import jakarta.persistence.criteria.Root;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
EmbeddableAscDescQueryTest.EntityA.class,
|
||||
EmbeddableAscDescQueryTest.EntityB.class,
|
||||
EmbeddableAscDescQueryTest.EntityC.class,
|
||||
EmbeddableAscDescQueryTest.EntityD.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
@JiraKey("HHH-16997")
|
||||
public class EmbeddableAscDescQueryTest {
|
||||
|
||||
@BeforeEach
|
||||
public void setUp(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
EntityA entityA = new EntityA();
|
||||
entityA.setId( 1 );
|
||||
|
||||
EntityD entityD = new EntityD();
|
||||
entityD.setId( 1 );
|
||||
|
||||
ComponentB componentB = new ComponentB();
|
||||
componentB.setEntityD( entityD );
|
||||
|
||||
entityA.setComponentB( componentB );
|
||||
|
||||
EntityA entityA2 = new EntityA();
|
||||
entityA2.setId( 2 );
|
||||
|
||||
ComponentA componentA = new ComponentA();
|
||||
componentA.setEntityA( entityA );
|
||||
entityA2.setComponentA( componentA );
|
||||
|
||||
EntityB entityB = new EntityB();
|
||||
entityB.setEntityA( entityA );
|
||||
|
||||
session.persist( entityA );
|
||||
session.persist( entityD );
|
||||
session.persist( entityB );
|
||||
session.persist( entityA2 );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createMutationQuery( "delete from EntityB" ).executeUpdate();
|
||||
session.createMutationQuery( "delete from EntityC" ).executeUpdate();
|
||||
session.createMutationQuery( "delete from EntityA" ).executeUpdate();
|
||||
session.createMutationQuery( "delete from EntityD" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryAscAndDesc(SessionFactoryScope scope) {
|
||||
scope.inSession(
|
||||
session -> {
|
||||
session.getTransaction().begin();
|
||||
try {
|
||||
CriteriaBuilder cb = session.getCriteriaBuilder();
|
||||
CriteriaQuery<EntityA> query = cb.createQuery( EntityA.class );
|
||||
Root<EntityA> root = query.from( EntityA.class );
|
||||
query.select( root ).orderBy(
|
||||
cb.asc( root.get( "id" ) )
|
||||
);
|
||||
List<EntityA> entityAS = session.createQuery( query ).getResultList();
|
||||
assertThat( entityAS ).hasSize( 2 );
|
||||
|
||||
EntityA entityA1 = entityAS.get( 0 );
|
||||
assertThat( entityA1.getId() ).isEqualTo( 1 );
|
||||
assertThat( entityA1.getComponentB() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityD() ).isNotNull();
|
||||
|
||||
session.getTransaction().rollback();
|
||||
session.getTransaction().begin();
|
||||
|
||||
cb = session.getCriteriaBuilder();
|
||||
query = cb.createQuery( EntityA.class );
|
||||
root = query.from( EntityA.class );
|
||||
query.select( root ).orderBy(
|
||||
cb.desc( root.get( "id" ) )
|
||||
);
|
||||
entityAS = session.createQuery( query ).getResultList();
|
||||
assertThat( entityAS ).hasSize( 2 );
|
||||
|
||||
entityA1 = entityAS.get( 1 );
|
||||
assertThat( entityA1.getId() ).isEqualTo( 1 );
|
||||
assertThat( entityA1.getComponentB() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityD() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityC() ).isNull();
|
||||
|
||||
}
|
||||
finally {
|
||||
session.getTransaction().rollback();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryAsc(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
CriteriaBuilder cb = session.getCriteriaBuilder();
|
||||
CriteriaQuery<EntityA> query = cb.createQuery( EntityA.class );
|
||||
Root<EntityA> root = query.from( EntityA.class );
|
||||
query.select( root ).orderBy(
|
||||
cb.asc( root.get( "id" ) )
|
||||
);
|
||||
List<EntityA> entityAS = session.createQuery( query ).getResultList();
|
||||
assertThat( entityAS ).hasSize( 2 );
|
||||
|
||||
EntityA entityA1 = entityAS.get( 0 );
|
||||
assertThat( entityA1.getId() ).isEqualTo( 1 );
|
||||
assertThat( entityA1.getComponentB() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityD() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityC() ).isNull();
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryDesc(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
CriteriaBuilder cb = session.getCriteriaBuilder();
|
||||
CriteriaQuery<EntityA> query = cb.createQuery( EntityA.class );
|
||||
Root<EntityA> root = query.from( EntityA.class );
|
||||
query.select( root ).orderBy(
|
||||
cb.desc( root.get( "id" ) )
|
||||
);
|
||||
List<EntityA> entityAS = session.createQuery( query ).getResultList();
|
||||
assertThat( entityAS ).hasSize( 2 );
|
||||
|
||||
EntityA entityA1 = entityAS.get( 1 );
|
||||
assertThat( entityA1.getId() ).isEqualTo( 1 );
|
||||
assertThat( entityA1.getComponentB() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityD() ).isNotNull();
|
||||
assertThat( entityA1.getComponentB().getEntityC() ).isNull();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testQueryEntityB(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
List<EntityB> entityBS = session.createQuery( "select b from EntityB b" ).getResultList();
|
||||
assertThat( entityBS ).hasSize( 1 );
|
||||
|
||||
EntityB entrityB = entityBS.get( 0 );
|
||||
EntityA entityA = entrityB.getEntityA();
|
||||
assertThat( entityA ).isNotNull();
|
||||
assertThat( entityA.getId() ).isEqualTo( 1 );
|
||||
assertThat( entityA.getComponentB() ).isNotNull();
|
||||
assertThat( entityA.getComponentB().getEntityD() ).isNotNull();
|
||||
assertThat( entityA.getComponentB().getEntityC() ).isNull();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Entity(name = "EntityA")
|
||||
@Table(name = "t_entity_a")
|
||||
public static class EntityA {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
@Embedded
|
||||
private ComponentA componentA;
|
||||
|
||||
@Embedded
|
||||
private ComponentB componentB;
|
||||
|
||||
@OneToOne(mappedBy = "entityA")
|
||||
private EntityB entityB;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public EntityB getEntityB() {
|
||||
return entityB;
|
||||
}
|
||||
|
||||
public void setEntityB(EntityB entityB) {
|
||||
this.entityB = entityB;
|
||||
}
|
||||
|
||||
public ComponentA getComponentA() {
|
||||
return componentA;
|
||||
}
|
||||
|
||||
public void setComponentA(ComponentA componentA) {
|
||||
this.componentA = componentA;
|
||||
}
|
||||
|
||||
public ComponentB getComponentB() {
|
||||
return componentB;
|
||||
}
|
||||
|
||||
public void setComponentB(ComponentB componentB) {
|
||||
this.componentB = componentB;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
public static class ComponentA {
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "cmpa_a_id", referencedColumnName = "id")
|
||||
private EntityA entityA;
|
||||
|
||||
|
||||
public EntityA getEntityA() {
|
||||
return entityA;
|
||||
}
|
||||
|
||||
public void setEntityA(EntityA entityA) {
|
||||
this.entityA = entityA;
|
||||
}
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
public static class ComponentB {
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "cmpb_c_id", referencedColumnName = "id")
|
||||
private EntityC entityC;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "cmpb_d_id", referencedColumnName = "id")
|
||||
private EntityD entityD;
|
||||
|
||||
|
||||
public EntityC getEntityC() {
|
||||
return entityC;
|
||||
}
|
||||
|
||||
public void setEntityC(EntityC entityC) {
|
||||
this.entityC = entityC;
|
||||
}
|
||||
|
||||
public EntityD getEntityD() {
|
||||
return entityD;
|
||||
}
|
||||
|
||||
public void setEntityD(EntityD entityD) {
|
||||
this.entityD = entityD;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "EntityB")
|
||||
@Table(name = "t_entity_b")
|
||||
public static class EntityB {
|
||||
|
||||
@Id
|
||||
@OneToOne
|
||||
@JoinColumn(name = "id", referencedColumnName = "id")
|
||||
private EntityA entityA;
|
||||
|
||||
private String name;
|
||||
|
||||
public EntityA getEntityA() {
|
||||
return entityA;
|
||||
}
|
||||
|
||||
public void setEntityA(EntityA entityA) {
|
||||
this.entityA = entityA;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "EntityC")
|
||||
@Table(name = "t_entity_c")
|
||||
public static class EntityC {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "EntityD")
|
||||
@Table(name = "t_entity_d")
|
||||
public static class EntityD {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue