HHH-17460 - Ongoing JPA 32 work

This commit is contained in:
Steve Ebersole 2024-03-26 15:56:27 -05:00
parent aabea961e9
commit fc9401e725
4 changed files with 180 additions and 129 deletions

View File

@ -0,0 +1,177 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.xml.internal;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedAttributeNodeImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedEntityGraphImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedSubgraphImpl;
import org.hibernate.boot.models.JpaAnnotations;
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.MutableAnnotationUsage;
import org.hibernate.models.spi.MutableClassDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph;
import jakarta.persistence.NamedEntityGraphs;
import jakarta.persistence.NamedSubgraph;
import static org.hibernate.boot.models.JpaAnnotations.NAMED_ATTRIBUTE_NODE;
import static org.hibernate.boot.models.internal.AnnotationUsageHelper.applyStringAttributeIfSpecified;
import static org.hibernate.boot.models.xml.internal.XmlProcessingHelper.applyAttributeIfSpecified;
import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
/**
* Processing for JPA entity graphs from XML
*
* @author Steve Ebersole
*/
public class EntityGraphProcessing {
public static void applyEntityGraphs(
JaxbEntityImpl jaxbEntity,
MutableClassDetails classDetails,
XmlDocumentContext xmlDocumentContext) {
final List<JaxbNamedEntityGraphImpl> jaxbEntityGraphs = jaxbEntity.getNamedEntityGraphs();
if ( CollectionHelper.isEmpty( jaxbEntityGraphs ) ) {
return;
}
final SourceModelBuildingContext modelBuildingContext = xmlDocumentContext.getModelBuildingContext();
final MutableAnnotationUsage<NamedEntityGraphs> entityGraphsUsage = JpaAnnotations.NAMED_ENTITY_GRAPHS.createUsage(
classDetails,
modelBuildingContext
);
classDetails.addAnnotationUsage( entityGraphsUsage );
final ArrayList<Object> entityGraphList = arrayList( jaxbEntityGraphs.size() );
entityGraphsUsage.setAttributeValue( "value", entityGraphList );
for ( JaxbNamedEntityGraphImpl namedEntityGraph : jaxbEntityGraphs ) {
final AnnotationUsage<NamedEntityGraph> graphUsage = extractGraph( namedEntityGraph, classDetails, modelBuildingContext, xmlDocumentContext );
entityGraphList.add( graphUsage );
}
}
private static AnnotationUsage<NamedEntityGraph> extractGraph(
JaxbNamedEntityGraphImpl jaxbEntityGraph,
ClassDetails classDetails,
SourceModelBuildingContext modelBuildingContext,
XmlDocumentContext xmlDocumentContext) {
final MutableAnnotationUsage<NamedEntityGraph> graphUsage = JpaAnnotations.NAMED_ENTITY_GRAPH.createUsage(
classDetails,
modelBuildingContext
);
applyStringAttributeIfSpecified( "name", jaxbEntityGraph.getName(), graphUsage );
applyAttributeIfSpecified( "includeAllAttributes", jaxbEntityGraph.isIncludeAllAttributes(), graphUsage );
if ( CollectionHelper.isNotEmpty( jaxbEntityGraph.getNamedAttributeNode() ) ) {
final List<MutableAnnotationUsage<NamedAttributeNode>> attributeNodeList = extractAttributeNodes(
jaxbEntityGraph.getNamedAttributeNode(),
classDetails,
modelBuildingContext,
xmlDocumentContext
);
graphUsage.setAttributeValue( "attributeNodes", attributeNodeList );
}
if ( CollectionHelper.isNotEmpty( jaxbEntityGraph.getSubgraph() ) ) {
final List<MutableAnnotationUsage<NamedSubgraph>> subgraphList = extractSubgraphNodes(
jaxbEntityGraph.getSubgraph(),
classDetails,
modelBuildingContext,
xmlDocumentContext
);
graphUsage.setAttributeValue( "subgraphs", subgraphList );
}
if ( CollectionHelper.isNotEmpty( jaxbEntityGraph.getSubclassSubgraph() ) ) {
final List<MutableAnnotationUsage<NamedSubgraph>> subgraphList = extractSubgraphNodes(
jaxbEntityGraph.getSubclassSubgraph(),
classDetails,
modelBuildingContext,
xmlDocumentContext
);
graphUsage.setAttributeValue( "subclassSubgraphs", subgraphList );
}
return graphUsage;
}
private static List<MutableAnnotationUsage<NamedAttributeNode>> extractAttributeNodes(
List<JaxbNamedAttributeNodeImpl> jaxbAttributeNodes,
ClassDetails classDetails,
SourceModelBuildingContext modelBuildingContext,
XmlDocumentContext xmlDocumentContext) {
assert CollectionHelper.isNotEmpty( jaxbAttributeNodes );
final ArrayList<MutableAnnotationUsage<NamedAttributeNode>> attributeNodeList = arrayList( jaxbAttributeNodes.size() );
for ( JaxbNamedAttributeNodeImpl jaxbAttributeNode : jaxbAttributeNodes ) {
final MutableAnnotationUsage<NamedAttributeNode> namedAttributeNodeAnn = NAMED_ATTRIBUTE_NODE.createUsage(
classDetails,
modelBuildingContext
);
attributeNodeList.add( namedAttributeNodeAnn );
namedAttributeNodeAnn.setAttributeValue( "value", jaxbAttributeNode.getName() );
applyStringAttributeIfSpecified( "subgraph", jaxbAttributeNode.getSubgraph(), namedAttributeNodeAnn );
applyStringAttributeIfSpecified( "keySubgraph", jaxbAttributeNode.getKeySubgraph(), namedAttributeNodeAnn );
}
return attributeNodeList;
}
private static List<MutableAnnotationUsage<NamedSubgraph>> extractSubgraphNodes(
List<JaxbNamedSubgraphImpl> jaxbSubgraphs,
ClassDetails classDetails,
SourceModelBuildingContext modelBuildingContext,
XmlDocumentContext xmlDocumentContext) {
assert CollectionHelper.isNotEmpty( jaxbSubgraphs );
final List<MutableAnnotationUsage<NamedSubgraph>> subgraphAnnotations = arrayList( jaxbSubgraphs.size() );
for ( JaxbNamedSubgraphImpl jaxbSubgraph : jaxbSubgraphs ) {
final MutableAnnotationUsage<NamedSubgraph> namedSubGraphUsage = JpaAnnotations.NAMED_SUB_GRAPH.createUsage(
classDetails,
modelBuildingContext
);
subgraphAnnotations.add( namedSubGraphUsage );
namedSubGraphUsage.setAttributeValue( "name", jaxbSubgraph.getName() );
final ClassDetails typeDetails;
if ( jaxbSubgraph.getClazz() == null ) {
typeDetails = ClassDetails.VOID_CLASS_DETAILS;
}
else {
typeDetails = xmlDocumentContext.resolveJavaType( jaxbSubgraph.getClazz() );
}
namedSubGraphUsage.setAttributeValue( "type", typeDetails );
if ( CollectionHelper.isNotEmpty( jaxbSubgraph.getNamedAttributeNode() ) ) {
namedSubGraphUsage.setAttributeValue(
"attributeNodes",
extractAttributeNodes(
jaxbSubgraph.getNamedAttributeNode(),
classDetails,
modelBuildingContext,
xmlDocumentContext
)
);
}
}
return subgraphAnnotations;
}
}

View File

@ -526,10 +526,7 @@ public class ManagedTypeProcessor {
applyTenantId( classDetails, jaxbEntity, classAccessType, xmlDocumentContext );
final List<JaxbNamedEntityGraphImpl> namedEntityGraphs = jaxbEntity.getNamedEntityGraphs();
for ( JaxbNamedEntityGraphImpl namedEntityGraph : namedEntityGraphs ) {
XmlAnnotationHelper.applyNamedEntityGraph( namedEntityGraph, classDetails, xmlDocumentContext );
}
EntityGraphProcessing.applyEntityGraphs( jaxbEntity, classDetails, xmlDocumentContext );
XmlAnnotationHelper.applyDiscriminatorValue(
jaxbEntity.getDiscriminatorValue(),
@ -548,7 +545,6 @@ public class ManagedTypeProcessor {
classDetails,
xmlDocumentContext
);
// todo : secondary-tables
}
private static void applyAccessAnnotation(

View File

@ -54,6 +54,8 @@ import static org.hibernate.internal.util.StringHelper.isEmpty;
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
/**
* Processing of queries from XML
*
* @author Steve Ebersole
*/
public class QueryProcessing {

View File

@ -1491,130 +1491,6 @@ public class XmlAnnotationHelper {
return value;
}
static void applyNamedEntityGraph(
JaxbNamedEntityGraphImpl namedEntityGraph,
MutableClassDetails target,
XmlDocumentContext xmlDocumentContext) {
if ( namedEntityGraph != null ) {
final MutableAnnotationUsage<NamedEntityGraph> namedEntityGraphAnn = XmlProcessingHelper.getOrMakeAnnotation(
NamedEntityGraph.class,
target,
xmlDocumentContext
);
final AnnotationDescriptor<NamedEntityGraph> namedEntityGraphAnnotationDescriptor = namedEntityGraphAnn.getAnnotationDescriptor();
XmlProcessingHelper.applyAttributeIfSpecified( "name", namedEntityGraph.getName(), namedEntityGraphAnn );
XmlProcessingHelper.applyAttributeIfSpecified( "includeAllAttributes", namedEntityGraph.isIncludeAllAttributes(), namedEntityGraphAnn );
namedEntityGraphAnn.setAttributeValue(
"attributeNodes",
makeNamedAttributeNodes( namedEntityGraph.getNamedAttributeNode(), target, xmlDocumentContext )
);
namedEntityGraphAnn.setAttributeValue(
"subgraphs",
makeNamedSubgraphs(
target,
xmlDocumentContext,
namedEntityGraph.getSubgraph()
)
);
namedEntityGraphAnn.setAttributeValue(
"subclassSubgraphs",
makeNamedSubgraphs(
target,
xmlDocumentContext,
namedEntityGraph.getSubclassSubgraph()
)
);
}
}
private static List<MutableAnnotationUsage<NamedSubgraph>> makeNamedSubgraphs(
MutableClassDetails target,
XmlDocumentContext xmlDocumentContext,
List<JaxbNamedSubgraphImpl> subclassSubgraphNodes) {
final List<MutableAnnotationUsage<NamedSubgraph>> subgraphAnnotations =
new ArrayList<>( subclassSubgraphNodes.size() );
for ( JaxbNamedSubgraphImpl subclassSubgraphNode : subclassSubgraphNodes ) {
final String subGraphsNodeName = subclassSubgraphNode.getName();
final MutableAnnotationUsage<NamedSubgraph> namedSubgraphNodeAnn = XmlProcessingHelper.getOrMakeNamedAnnotation(
NamedSubgraph.class,
subGraphsNodeName,
target,
xmlDocumentContext
);
XmlProcessingHelper.applyAttributeIfSpecified( "name", subGraphsNodeName, namedSubgraphNodeAnn );
final String clazz = subclassSubgraphNode.getClazz();
if ( clazz == null ) {
namedSubgraphNodeAnn.setAttributeValue(
"type",
resolveJavaType(
namedSubgraphNodeAnn.getAnnotationDescriptor()
.getAttribute( "type" )
.getAttributeMethod()
.getDefaultValue().toString(),
xmlDocumentContext
)
);
}
else {
namedSubgraphNodeAnn.setAttributeValue(
"type",
resolveJavaType( subclassSubgraphNode.getClazz(), xmlDocumentContext )
);
}
namedSubgraphNodeAnn.setAttributeValue(
"attributeNodes",
makeNamedAttributeNodes( subclassSubgraphNode.getNamedAttributeNode(), target, xmlDocumentContext )
);
subgraphAnnotations.add( namedSubgraphNodeAnn );
}
return subgraphAnnotations;
}
private static List<MutableAnnotationUsage<NamedAttributeNode>> makeNamedAttributeNodes(
List<JaxbNamedAttributeNodeImpl> namedAttributeNodes,
MutableClassDetails target,
XmlDocumentContext xmlDocumentContext) {
final List<MutableAnnotationUsage<NamedAttributeNode>> namedAttributeNodeAnnotations =
new ArrayList<>( namedAttributeNodes.size() );
for ( JaxbNamedAttributeNodeImpl namedAttributeNode : namedAttributeNodes ) {
final MutableAnnotationUsage<NamedAttributeNode> namedAttributeNodeAnn = NAMED_ATTRIBUTE_NODE.createUsage(
target,
xmlDocumentContext.getModelBuildingContext()
);
XmlProcessingHelper.applyAttributeIfSpecified( "value", namedAttributeNode.getName(), namedAttributeNodeAnn );
final AnnotationDescriptor<NamedAttributeNode> namedAttributeNodeDescriptor = xmlDocumentContext
.getModelBuildingContext()
.getAnnotationDescriptorRegistry()
.getDescriptor( NamedAttributeNode.class );
applyOr(
namedAttributeNode,
JaxbNamedAttributeNodeImpl::getSubgraph,
"subgraph",
namedAttributeNodeAnn,
namedAttributeNodeDescriptor
);
applyOr(
namedAttributeNode,
JaxbNamedAttributeNodeImpl::getKeySubgraph,
"keySubgraph",
namedAttributeNodeAnn,
namedAttributeNodeDescriptor
);
namedAttributeNodeAnnotations.add( namedAttributeNodeAnn );
}
return namedAttributeNodeAnnotations;
}
static void applyDiscriminatorValue(
String discriminatorValue,
MutableClassDetails target,