HHH-15674 Add test for issue
This commit is contained in:
parent
a7a455c39a
commit
ff28d677ab
|
@ -0,0 +1,195 @@
|
||||||
|
package org.hibernate.orm.test.entitygraph;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.hibernate.Hibernate;
|
||||||
|
import org.hibernate.jpa.SpecHints;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.FetchType;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.IdClass;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.NamedAttributeNode;
|
||||||
|
import jakarta.persistence.NamedEntityGraph;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
@DomainModel(
|
||||||
|
annotatedClasses = {
|
||||||
|
LoadEntityWithIdClassEntityGraphTest.OrderItem.class,
|
||||||
|
LoadEntityWithIdClassEntityGraphTest.Order.class,
|
||||||
|
LoadEntityWithIdClassEntityGraphTest.Product.class
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@SessionFactory
|
||||||
|
@TestForIssue( jiraKey = "HHH-15674")
|
||||||
|
public class LoadEntityWithIdClassEntityGraphTest {
|
||||||
|
|
||||||
|
private static final Long ORDER_ID = 1l;
|
||||||
|
private static final Long PRODUCT_ID = 2l;
|
||||||
|
|
||||||
|
private static final String NAMED_GRAPH_NAME = "OrderItem.fetchAll";
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public void setUp(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Order order = new Order( ORDER_ID, new BigDecimal( 1000 ) );
|
||||||
|
Product product = new Product( PRODUCT_ID, "laptop" );
|
||||||
|
OrderItem orderItem = new OrderItem( product, order );
|
||||||
|
|
||||||
|
session.persist( order );
|
||||||
|
session.persist( product );
|
||||||
|
session.persist( orderItem );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFetchGraph(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
OrderItem orderItem = session.createQuery(
|
||||||
|
"SELECT e FROM OrderItem e WHERE e.order.id = :orderId AND e.product.id = :productId",
|
||||||
|
OrderItem.class
|
||||||
|
)
|
||||||
|
.setParameter( "orderId", ORDER_ID )
|
||||||
|
.setParameter( "productId", PRODUCT_ID )
|
||||||
|
.setHint(
|
||||||
|
SpecHints.HINT_SPEC_FETCH_GRAPH,
|
||||||
|
scope.getSessionFactory().createEntityManager().getEntityGraph( NAMED_GRAPH_NAME )
|
||||||
|
)
|
||||||
|
.getSingleResult();
|
||||||
|
assertTrue( Hibernate.isInitialized( orderItem.getOrder() ), "Order has not been fetched" );
|
||||||
|
assertTrue( Hibernate.isInitialized( orderItem.getProduct() ), "Product has not been fetched" );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "OrderItem")
|
||||||
|
@IdClass(OrderItem.PK.class)
|
||||||
|
@NamedEntityGraph(
|
||||||
|
name = NAMED_GRAPH_NAME,
|
||||||
|
attributeNodes = {
|
||||||
|
@NamedAttributeNode("product"),
|
||||||
|
@NamedAttributeNode("order"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public static class OrderItem {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "product_id")
|
||||||
|
private Product product;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "order_id")
|
||||||
|
private Order order;
|
||||||
|
|
||||||
|
public OrderItem() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItem(Product product, Order order) {
|
||||||
|
this.product = product;
|
||||||
|
this.order = order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Product getProduct() {
|
||||||
|
return product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Order getOrder() {
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PK implements Serializable {
|
||||||
|
private Long product;
|
||||||
|
private Long order;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if ( this == o ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
PK pk = (PK) o;
|
||||||
|
return Objects.equals( product, pk.product ) && Objects.equals( order, pk.order );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash( product, order );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Entity(name = "Order")
|
||||||
|
@Table(name = "ORDER_TABLE")
|
||||||
|
public static class Order {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private BigDecimal total;
|
||||||
|
|
||||||
|
public Order() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Order(Long id, BigDecimal total) {
|
||||||
|
this.id = id;
|
||||||
|
this.total = total;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getTotal() {
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Product")
|
||||||
|
public static class Product {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Product() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Product(Long id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue