Skip to content

Commit d8faee0

Browse files
zeitigergsmet
authored andcommitted
HHH-13233 Add missing implementation to add attribute to subgraphs
1 parent 89f523c commit d8faee0

File tree

2 files changed

+105
-3
lines changed

2 files changed

+105
-3
lines changed

hibernate-core/src/main/java/org/hibernate/graph/internal/SubGraphImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.graph.spi.AttributeNodeImplementor;
1313
import org.hibernate.graph.spi.SubGraphImplementor;
1414
import org.hibernate.metamodel.model.domain.spi.ManagedTypeDescriptor;
15+
import org.hibernate.metamodel.model.domain.spi.PersistentAttributeDescriptor;
1516

1617
/**
1718
* @author Steve Ebersole
@@ -48,8 +49,9 @@ public <AJ> SubGraphImplementor<AJ> addKeySubGraph(String attributeName) {
4849
}
4950

5051
@Override
52+
@SuppressWarnings("unchecked")
5153
public <AJ> AttributeNodeImplementor<AJ> addAttributeNode(Attribute<? extends J, AJ> attribute) {
52-
return null;
54+
return addAttributeNode( (PersistentAttributeDescriptor) attribute );
5355
}
5456

5557
@Override

hibernate-core/src/test/java/org/hibernate/jpa/test/graphs/EntityGraphUsingFetchGraphTest.java

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
*/
77
package org.hibernate.jpa.test.graphs;
88

9+
import javax.persistence.AttributeNode;
910
import javax.persistence.Entity;
1011
import javax.persistence.EntityGraph;
1112
import javax.persistence.EntityManager;
1213
import javax.persistence.GeneratedValue;
13-
import javax.persistence.GenerationType;
1414
import javax.persistence.Id;
1515
import javax.persistence.JoinColumn;
1616
import javax.persistence.ManyToOne;
@@ -20,15 +20,19 @@
2020
import javax.persistence.Temporal;
2121
import javax.persistence.TemporalType;
2222
import javax.persistence.TypedQuery;
23+
import javax.persistence.metamodel.Attribute;
2324

25+
import java.util.Collection;
2426
import java.util.Date;
2527
import java.util.List;
2628

2729
import org.hibernate.Hibernate;
2830
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
31+
import org.hibernate.metamodel.model.domain.spi.EntityTypeDescriptor;
2932
import org.hibernate.testing.TestForIssue;
3033
import org.junit.Test;
3134

35+
import static org.junit.Assert.assertEquals;
3236
import static org.junit.Assert.assertTrue;
3337

3438
/**
@@ -93,7 +97,7 @@ public void fetchSubGraphFromSubgraph() {
9397

9498
@Test
9599
@TestForIssue( jiraKey = "HHH-9392")
96-
public void fetchAttributeNodeFromSubgraph() {
100+
public void fetchAttributeNodeByStringFromSubgraph() {
97101
EntityManager em = getOrCreateEntityManager();
98102
em.getTransaction().begin();
99103

@@ -136,6 +140,70 @@ public void fetchAttributeNodeFromSubgraph() {
136140
query.setHint( "javax.persistence.loadgraph", entityGraph );
137141
final List<CustomerOrder> results = query.getResultList();
138142

143+
assertEntityGraph( entityGraph );
144+
assertTrue( Hibernate.isInitialized( results ) );
145+
146+
em.getTransaction().commit();
147+
em.close();
148+
}
149+
150+
@Test
151+
@TestForIssue( jiraKey = "HHH-13233")
152+
@SuppressWarnings({ "unchecked", "rawtypes" })
153+
public void fetchAttributeNodeByAttributeFromSubgraph() {
154+
EntityManager em = getOrCreateEntityManager();
155+
em.getTransaction().begin();
156+
157+
Address address = new Address();
158+
address.city = "TestCity";
159+
160+
CustomerOrder customerOrder = new CustomerOrder();
161+
customerOrder.shippingAddress = address;
162+
163+
Product product = new Product();
164+
165+
OrderPosition orderPosition = new OrderPosition();
166+
orderPosition.product = product;
167+
168+
customerOrder.orderPosition = orderPosition;
169+
em.persist( address );
170+
em.persist( orderPosition );
171+
em.persist( product );
172+
em.persist( customerOrder );
173+
174+
em.getTransaction().commit();
175+
em.clear();
176+
177+
em.getTransaction().begin();
178+
179+
final EntityGraph<CustomerOrder> entityGraph = em.createEntityGraph( CustomerOrder.class );
180+
EntityTypeDescriptor<CustomerOrder> customerOrderEntityType =
181+
entityManagerFactory().getMetamodel().entity( CustomerOrder.class );
182+
entityGraph.addAttributeNodes(
183+
(Attribute) customerOrderEntityType.getAttribute( "shippingAddress" ),
184+
(Attribute) customerOrderEntityType.getAttribute( "orderDate" )
185+
);
186+
entityGraph.addAttributeNodes( (Attribute) customerOrderEntityType.getAttribute( "shippingAddress" ) );
187+
188+
final Subgraph<OrderPosition> orderProductsSubgraph =
189+
entityGraph.addSubgraph( (Attribute) customerOrderEntityType.getAttribute( "orderPosition" ) );
190+
EntityTypeDescriptor<OrderPosition> positionEntityType =
191+
entityManagerFactory().getMetamodel().entity( OrderPosition.class );
192+
orderProductsSubgraph.addAttributeNodes( (Attribute) positionEntityType.getAttribute( "amount" ) );
193+
orderProductsSubgraph.addAttributeNodes( (Attribute) positionEntityType.getAttribute( "product" ) );
194+
195+
final Subgraph<Product> productSubgraph =
196+
orderProductsSubgraph.addSubgraph( (Attribute) positionEntityType.getAttribute( "product" ) );
197+
EntityTypeDescriptor<Product> productEntityType = entityManagerFactory().getMetamodel().entity( Product.class );
198+
productSubgraph.addAttributeNodes( (Attribute) productEntityType.getAttribute( "productName" ) );
199+
200+
TypedQuery<CustomerOrder> query = em.createQuery(
201+
"SELECT o FROM EntityGraphUsingFetchGraphTest$CustomerOrder o", CustomerOrder.class
202+
);
203+
query.setHint( "javax.persistence.loadgraph", entityGraph );
204+
final List<CustomerOrder> results = query.getResultList();
205+
206+
assertEntityGraph( entityGraph );
139207
assertTrue( Hibernate.isInitialized( results ) );
140208

141209
em.getTransaction().commit();
@@ -184,6 +252,38 @@ public void fetchUsingHql() {
184252
em.close();
185253
}
186254

255+
256+
/**
257+
* Verify that entityGraph has expected state
258+
*
259+
* customerOrder - shippingAddress
260+
* - orderDate
261+
* - orderPosition - amount
262+
* - product - productName
263+
*
264+
* @param entityGraph entityGraph
265+
*/
266+
private void assertEntityGraph(EntityGraph<CustomerOrder> entityGraph) {
267+
assertEquals(3, entityGraph.getAttributeNodes().size());
268+
for ( AttributeNode<?> entityGraphAttributeNode : entityGraph.getAttributeNodes() ) {
269+
if ( "orderPosition".equals( entityGraphAttributeNode.getAttributeName() ) ) {
270+
Collection<Subgraph> orderPositionGraph = entityGraphAttributeNode.getSubgraphs().values();
271+
assertEquals( 1, orderPositionGraph.size() );
272+
List<AttributeNode<?>> orderPositionAttributes = orderPositionGraph.iterator().next().getAttributeNodes();
273+
assertEquals( 2, orderPositionAttributes.size() );
274+
for ( AttributeNode<?> orderPositionAttributeNode : orderPositionAttributes ) {
275+
if ( "product".equals( orderPositionAttributeNode.getAttributeName() ) ) {
276+
assertEquals( 1, orderPositionAttributeNode.getSubgraphs().size() );
277+
} else {
278+
assertTrue( orderPositionAttributeNode.getSubgraphs().isEmpty() );
279+
}
280+
}
281+
} else {
282+
assertTrue( entityGraphAttributeNode.getSubgraphs().isEmpty() );
283+
}
284+
}
285+
}
286+
187287
@Entity
188288
@Table(name = "customerOrder")
189289
public static class CustomerOrder {

0 commit comments

Comments
 (0)