Skip to content

Commit 0b770f9

Browse files
beikovsebersole
authored andcommitted
JPA 3.2 support WIP
1 parent 7490f4b commit 0b770f9

File tree

96 files changed

+3786
-3041
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+3786
-3041
lines changed

checkerstubs/jakarta.persistence.astub

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public interface EntityManager extends AutoCloseable {
1717
public interface EntityManagerFactory extends AutoCloseable {
1818
public @Nullable Cache getCache();
1919
}
20+
public interface EntityTransaction {
21+
@Nullable Integer getTimeout();
22+
}
2023
public interface Parameter {
2124
public @Nullable String getName();
2225
public @Nullable Integer getPosition();

hibernate-core/src/main/java/org/hibernate/Hibernate.java

+25
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,31 @@ public static boolean isPropertyInitialized(Object proxy, String attributeName)
349349
return true;
350350
}
351351

352+
/**
353+
* Initializes the property with the given name of the given entity instance.
354+
* <p>
355+
* This operation is equivalent to {@link jakarta.persistence.PersistenceUnitUtil#load(Object, String)}.
356+
*
357+
* @param proxy The entity instance or proxy
358+
* @param attributeName the name of a persistent attribute of the object
359+
*/
360+
public static void initializeProperty(Object proxy, String attributeName) {
361+
final Object entity;
362+
final LazyInitializer lazyInitializer = extractLazyInitializer( proxy );
363+
if ( lazyInitializer != null ) {
364+
entity = lazyInitializer.getImplementation();
365+
}
366+
else {
367+
entity = proxy;
368+
}
369+
370+
if ( isPersistentAttributeInterceptable( entity ) ) {
371+
PersistentAttributeInterceptor interceptor =
372+
asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
373+
interceptor.readObject( entity, attributeName, null );
374+
}
375+
}
376+
352377
/**
353378
* If the given object is not a proxy, return it. But, if it is a proxy, ensure
354379
* that the proxy is initialized, and return a direct reference to its proxied

hibernate-core/src/main/java/org/hibernate/Session.java

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import jakarta.persistence.FlushModeType;
2424
import jakarta.persistence.LockModeType;
2525
import jakarta.persistence.PessimisticLockScope;
26+
import jakarta.persistence.TypedQueryReference;
2627
import jakarta.persistence.criteria.CriteriaDelete;
2728
import jakarta.persistence.criteria.CriteriaQuery;
2829
import jakarta.persistence.criteria.CriteriaUpdate;
@@ -1574,6 +1575,9 @@ default LockRequest setLockScope(PessimisticLockScope scope) {
15741575
@Override
15751576
<R> Query<R> createQuery(String queryString, Class<R> resultClass);
15761577

1578+
@Override
1579+
<R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference);
1580+
15771581
@Override @Deprecated @SuppressWarnings("rawtypes")
15781582
Query createQuery(String queryString);
15791583

hibernate-core/src/main/java/org/hibernate/Transaction.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import jakarta.persistence.EntityTransaction;
1010
import jakarta.transaction.Synchronization;
11+
import org.checkerframework.checker.nullness.qual.Nullable;
1112

1213
import org.hibernate.resource.transaction.spi.TransactionStatus;
1314

@@ -66,7 +67,7 @@ public interface Transaction extends EntityTransaction {
6667
*
6768
* @return The timeout, in seconds.
6869
*/
69-
int getTimeout();
70+
@Nullable Integer getTimeout();
7071

7172
/**
7273
* Attempt to mark the underlying transaction for rollback only.

hibernate-core/src/main/java/org/hibernate/annotations/NamedQuery.java

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
import jakarta.persistence.CacheRetrieveMode;
1414
import jakarta.persistence.CacheStoreMode;
15+
import jakarta.persistence.EntityManager;
16+
1517
import org.hibernate.Remove;
1618

1719
import static java.lang.annotation.ElementType.PACKAGE;
@@ -47,6 +49,15 @@
4749
*/
4850
String query();
4951

52+
/**
53+
* Optional query result class that is used by default when creating the query.
54+
* May be overridden by explicitly passing a class object to
55+
* {@link EntityManager#createNamedQuery(String, Class)}.
56+
*
57+
* @see jakarta.persistence.NamedQuery#resultClass()
58+
*/
59+
Class<?> resultClass() default void.class;
60+
5061
/**
5162
* The flush mode for this query.
5263
*

hibernate-core/src/main/java/org/hibernate/boot/Metadata.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -115,24 +115,24 @@ public interface Metadata extends Mapping {
115115
*
116116
* @return The named query metadata, or {@code null}.
117117
*/
118-
NamedHqlQueryDefinition getNamedHqlQueryMapping(String name);
118+
NamedHqlQueryDefinition<?> getNamedHqlQueryMapping(String name);
119119

120120
/**
121121
* Visit all named HQL query definitions
122122
*/
123-
void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition> definitionConsumer);
123+
void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition<?>> definitionConsumer);
124124

125125
/**
126126
* Retrieve named SQL query metadata.
127127
*
128128
* @return The named query metadata, or {@code null}
129129
*/
130-
NamedNativeQueryDefinition getNamedNativeQueryMapping(String name);
130+
NamedNativeQueryDefinition<?> getNamedNativeQueryMapping(String name);
131131

132132
/**
133133
* Visit all named native query definitions
134134
*/
135-
void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition> definitionConsumer);
135+
void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition<?>> definitionConsumer);
136136

137137
/**
138138
* Retrieve named procedure metadata.

hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ public class InFlightMetadataCollectorImpl implements InFlightMetadataCollector,
164164

165165
private Database database;
166166

167-
private final Map<String, NamedHqlQueryDefinition> namedQueryMap = new HashMap<>();
168-
private final Map<String, NamedNativeQueryDefinition> namedNativeQueryMap = new HashMap<>();
167+
private final Map<String, NamedHqlQueryDefinition<?>> namedQueryMap = new HashMap<>();
168+
private final Map<String, NamedNativeQueryDefinition<?>> namedNativeQueryMap = new HashMap<>();
169169
private final Map<String, NamedProcedureCallDefinition> namedProcedureCallMap = new HashMap<>();
170170
private final Map<String, NamedResultSetMappingDescriptor> sqlResultSetMappingMap = new HashMap<>();
171171

@@ -763,20 +763,20 @@ public void addNamedEntityGraph(NamedEntityGraphDefinition definition) {
763763
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
764764
// Named query handling
765765

766-
public NamedHqlQueryDefinition getNamedHqlQueryMapping(String name) {
766+
public NamedHqlQueryDefinition<?> getNamedHqlQueryMapping(String name) {
767767
if ( name == null ) {
768768
throw new IllegalArgumentException( "null is not a valid query name" );
769769
}
770770
return namedQueryMap.get( name );
771771
}
772772

773773
@Override
774-
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition> definitionConsumer) {
774+
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition<?>> definitionConsumer) {
775775
namedQueryMap.values().forEach( definitionConsumer );
776776
}
777777

778778
@Override
779-
public void addNamedQuery(NamedHqlQueryDefinition def) {
779+
public void addNamedQuery(NamedHqlQueryDefinition<?> def) {
780780
if ( def == null ) {
781781
throw new IllegalArgumentException( "Named query definition is null" );
782782
}
@@ -791,7 +791,7 @@ else if ( def.getRegistrationName() == null ) {
791791
applyNamedQuery( def.getRegistrationName(), def );
792792
}
793793

794-
private void applyNamedQuery(String name, NamedHqlQueryDefinition query) {
794+
private void applyNamedQuery(String name, NamedHqlQueryDefinition<?> query) {
795795
checkQueryName( name );
796796
namedQueryMap.put( name.intern(), query );
797797
}
@@ -803,7 +803,7 @@ private void checkQueryName(String name) throws DuplicateMappingException {
803803
}
804804

805805
@Override
806-
public void addDefaultQuery(NamedHqlQueryDefinition queryDefinition) {
806+
public void addDefaultQuery(NamedHqlQueryDefinition<?> queryDefinition) {
807807
applyNamedQuery( queryDefinition.getRegistrationName(), queryDefinition );
808808
defaultNamedQueryNames.add( queryDefinition.getRegistrationName() );
809809
}
@@ -812,17 +812,17 @@ public void addDefaultQuery(NamedHqlQueryDefinition queryDefinition) {
812812
// Named native-query handling
813813

814814
@Override
815-
public NamedNativeQueryDefinition getNamedNativeQueryMapping(String name) {
815+
public NamedNativeQueryDefinition<?> getNamedNativeQueryMapping(String name) {
816816
return namedNativeQueryMap.get( name );
817817
}
818818

819819
@Override
820-
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition> definitionConsumer) {
820+
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition<?>> definitionConsumer) {
821821
namedNativeQueryMap.values().forEach( definitionConsumer );
822822
}
823823

824824
@Override
825-
public void addNamedNativeQuery(NamedNativeQueryDefinition def) {
825+
public void addNamedNativeQuery(NamedNativeQueryDefinition<?> def) {
826826
if ( def == null ) {
827827
throw new IllegalArgumentException( "Named native query definition object is null" );
828828
}
@@ -837,13 +837,13 @@ public void addNamedNativeQuery(NamedNativeQueryDefinition def) {
837837
applyNamedNativeQuery( def.getRegistrationName(), def );
838838
}
839839

840-
private void applyNamedNativeQuery(String name, NamedNativeQueryDefinition query) {
840+
private void applyNamedNativeQuery(String name, NamedNativeQueryDefinition<?> query) {
841841
checkQueryName( name );
842842
namedNativeQueryMap.put( name.intern(), query );
843843
}
844844

845845
@Override
846-
public void addDefaultNamedNativeQuery(NamedNativeQueryDefinition query) {
846+
public void addDefaultNamedNativeQuery(NamedNativeQueryDefinition<?> query) {
847847
applyNamedNativeQuery( query.getRegistrationName(), query );
848848
defaultNamedNativeQueryNames.add( query.getRegistrationName() );
849849
}

hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataImpl.java

+14-14
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
101101
private final Map<String, FetchProfile> fetchProfileMap;
102102
private final Map<String, String> imports;
103103
private final Map<String, IdentifierGeneratorDefinition> idGeneratorDefinitionMap;
104-
private final Map<String, NamedHqlQueryDefinition> namedQueryMap;
105-
private final Map<String, NamedNativeQueryDefinition> namedNativeQueryMap;
104+
private final Map<String, NamedHqlQueryDefinition<?>> namedQueryMap;
105+
private final Map<String, NamedNativeQueryDefinition<?>> namedNativeQueryMap;
106106
private final Map<String, NamedProcedureCallDefinition> namedProcedureCallMap;
107107
private final Map<String, NamedResultSetMappingDescriptor> sqlResultSetMappingMap;
108108
private final Map<String, NamedEntityGraphDefinition> namedEntityGraphMap;
@@ -123,8 +123,8 @@ public MetadataImpl(
123123
Map<String, FetchProfile> fetchProfileMap,
124124
Map<String, String> imports,
125125
Map<String, IdentifierGeneratorDefinition> idGeneratorDefinitionMap,
126-
Map<String, NamedHqlQueryDefinition> namedQueryMap,
127-
Map<String, NamedNativeQueryDefinition> namedNativeQueryMap,
126+
Map<String, NamedHqlQueryDefinition<?>> namedQueryMap,
127+
Map<String, NamedNativeQueryDefinition<?>> namedNativeQueryMap,
128128
Map<String, NamedProcedureCallDefinition> namedProcedureCallMap,
129129
Map<String, NamedResultSetMappingDescriptor> sqlResultSetMappingMap,
130130
Map<String, NamedEntityGraphDefinition> namedEntityGraphMap,
@@ -246,22 +246,22 @@ public Map<String, String> getImports() {
246246
}
247247

248248
@Override
249-
public NamedHqlQueryDefinition getNamedHqlQueryMapping(String name) {
249+
public NamedHqlQueryDefinition<?> getNamedHqlQueryMapping(String name) {
250250
return namedQueryMap.get( name );
251251
}
252252

253253
@Override
254-
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition> definitionConsumer) {
254+
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition<?>> definitionConsumer) {
255255
namedQueryMap.values().forEach( definitionConsumer );
256256
}
257257

258258
@Override
259-
public NamedNativeQueryDefinition getNamedNativeQueryMapping(String name) {
259+
public NamedNativeQueryDefinition<?> getNamedNativeQueryMapping(String name) {
260260
return namedNativeQueryMap.get( name );
261261
}
262262

263263
@Override
264-
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition> definitionConsumer) {
264+
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition<?>> definitionConsumer) {
265265
namedNativeQueryMap.values().forEach( definitionConsumer );
266266
}
267267

@@ -370,16 +370,16 @@ public NamedObjectRepository buildNamedQueryRepository(SessionFactoryImplementor
370370
);
371371
}
372372

373-
private Map<String, NamedSqmQueryMemento> buildNamedSqmMementos(SessionFactoryImplementor sessionFactory) {
374-
final HashMap<String, NamedSqmQueryMemento> map = new HashMap<>();
373+
private Map<String, NamedSqmQueryMemento<?>> buildNamedSqmMementos(SessionFactoryImplementor sessionFactory) {
374+
final HashMap<String, NamedSqmQueryMemento<?>> map = new HashMap<>();
375375
if ( namedQueryMap != null ) {
376376
namedQueryMap.forEach( (key, value) -> map.put( key, value.resolve( sessionFactory ) ) );
377377
}
378378
return map;
379379
}
380380

381-
private Map<String, NamedNativeQueryMemento> buildNamedNativeMementos(SessionFactoryImplementor sessionFactory) {
382-
final HashMap<String, NamedNativeQueryMemento> map = new HashMap<>();
381+
private Map<String, NamedNativeQueryMemento<?>> buildNamedNativeMementos(SessionFactoryImplementor sessionFactory) {
382+
final HashMap<String, NamedNativeQueryMemento<?>> map = new HashMap<>();
383383
if ( namedNativeQueryMap != null ) {
384384
namedNativeQueryMap.forEach( (key, value) -> map.put( key, value.resolve( sessionFactory ) ) );
385385
}
@@ -652,11 +652,11 @@ public BootstrapContext getBootstrapContext() {
652652
return bootstrapContext;
653653
}
654654

655-
public Map<String, NamedHqlQueryDefinition> getNamedQueryMap() {
655+
public Map<String, NamedHqlQueryDefinition<?>> getNamedQueryMap() {
656656
return namedQueryMap;
657657
}
658658

659-
public Map<String, NamedNativeQueryDefinition> getNamedNativeQueryMap() {
659+
public Map<String, NamedNativeQueryDefinition<?>> getNamedNativeQueryMap() {
660660
return namedNativeQueryMap;
661661
}
662662

hibernate-core/src/main/java/org/hibernate/boot/internal/NamedHqlQueryDefinitionImpl.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@
1717
import org.hibernate.query.hql.internal.NamedHqlQueryMementoImpl;
1818
import org.hibernate.query.sqm.spi.NamedSqmQueryMemento;
1919

20+
import org.checkerframework.checker.nullness.qual.Nullable;
21+
2022
/**
2123
* @author Steve Ebersole
2224
*/
23-
public class NamedHqlQueryDefinitionImpl extends AbstractNamedQueryDefinition implements NamedHqlQueryDefinition {
25+
public class NamedHqlQueryDefinitionImpl<E> extends AbstractNamedQueryDefinition<E> implements NamedHqlQueryDefinition<E> {
2426
private final String hqlString;
2527
private final Integer firstResult;
2628
private final Integer maxResults;
2729
private final Map<String, String> parameterTypes;
2830

2931
public NamedHqlQueryDefinitionImpl(
3032
String name,
33+
@Nullable Class<E> resultType,
3134
String hqlString,
3235
Integer firstResult,
3336
Integer maxResults,
@@ -44,6 +47,7 @@ public NamedHqlQueryDefinitionImpl(
4447
Map<String,Object> hints) {
4548
super(
4649
name,
50+
resultType,
4751
cacheable,
4852
cacheRegion,
4953
cacheMode,
@@ -67,9 +71,10 @@ public String getHqlString() {
6771
}
6872

6973
@Override
70-
public NamedSqmQueryMemento resolve(SessionFactoryImplementor factory) {
71-
return new NamedHqlQueryMementoImpl(
74+
public NamedSqmQueryMemento<E> resolve(SessionFactoryImplementor factory) {
75+
return new NamedHqlQueryMementoImpl<>(
7276
getRegistrationName(),
77+
getResultType(),
7378
hqlString,
7479
firstResult,
7580
maxResults,

0 commit comments

Comments
 (0)