HHH-17460 - Ongoing JPA 32 work
This commit is contained in:
parent
aabea961e9
commit
fc9401e725
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -526,10 +526,7 @@ public class ManagedTypeProcessor {
|
||||||
|
|
||||||
applyTenantId( classDetails, jaxbEntity, classAccessType, xmlDocumentContext );
|
applyTenantId( classDetails, jaxbEntity, classAccessType, xmlDocumentContext );
|
||||||
|
|
||||||
final List<JaxbNamedEntityGraphImpl> namedEntityGraphs = jaxbEntity.getNamedEntityGraphs();
|
EntityGraphProcessing.applyEntityGraphs( jaxbEntity, classDetails, xmlDocumentContext );
|
||||||
for ( JaxbNamedEntityGraphImpl namedEntityGraph : namedEntityGraphs ) {
|
|
||||||
XmlAnnotationHelper.applyNamedEntityGraph( namedEntityGraph, classDetails, xmlDocumentContext );
|
|
||||||
}
|
|
||||||
|
|
||||||
XmlAnnotationHelper.applyDiscriminatorValue(
|
XmlAnnotationHelper.applyDiscriminatorValue(
|
||||||
jaxbEntity.getDiscriminatorValue(),
|
jaxbEntity.getDiscriminatorValue(),
|
||||||
|
@ -548,7 +545,6 @@ public class ManagedTypeProcessor {
|
||||||
classDetails,
|
classDetails,
|
||||||
xmlDocumentContext
|
xmlDocumentContext
|
||||||
);
|
);
|
||||||
// todo : secondary-tables
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void applyAccessAnnotation(
|
private static void applyAccessAnnotation(
|
||||||
|
|
|
@ -54,6 +54,8 @@ import static org.hibernate.internal.util.StringHelper.isEmpty;
|
||||||
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
|
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Processing of queries from XML
|
||||||
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class QueryProcessing {
|
public class QueryProcessing {
|
||||||
|
|
|
@ -1491,130 +1491,6 @@ public class XmlAnnotationHelper {
|
||||||
return value;
|
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(
|
static void applyDiscriminatorValue(
|
||||||
String discriminatorValue,
|
String discriminatorValue,
|
||||||
MutableClassDetails target,
|
MutableClassDetails target,
|
||||||
|
|
Loading…
Reference in New Issue