Skip to content

Commit

Permalink
JPA 3.2 support WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
beikov authored and sebersole committed Apr 23, 2024
1 parent 124b0bf commit 2dddf6c
Show file tree
Hide file tree
Showing 95 changed files with 3,785 additions and 3,044 deletions.
3 changes: 3 additions & 0 deletions checkerstubs/jakarta.persistence.astub
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public interface EntityManager extends AutoCloseable {
public interface EntityManagerFactory extends AutoCloseable {
public @Nullable Cache getCache();
}
public interface EntityTransaction {
@Nullable Integer getTimeout();
}
public interface Parameter {
public @Nullable String getName();
public @Nullable Integer getPosition();
Expand Down
25 changes: 25 additions & 0 deletions hibernate-core/src/main/java/org/hibernate/Hibernate.java
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,31 @@ public static boolean isPropertyInitialized(Object proxy, String attributeName)
return true;
}

/**
* Initializes the property with the given name of the given entity instance.
* <p>
* This operation is equivalent to {@link jakarta.persistence.PersistenceUnitUtil#load(Object, String)}.
*
* @param proxy The entity instance or proxy
* @param attributeName the name of a persistent attribute of the object
*/
public static void initializeProperty(Object proxy, String attributeName) {
final Object entity;
final LazyInitializer lazyInitializer = extractLazyInitializer( proxy );
if ( lazyInitializer != null ) {
entity = lazyInitializer.getImplementation();
}
else {
entity = proxy;
}

if ( isPersistentAttributeInterceptable( entity ) ) {
PersistentAttributeInterceptor interceptor =
asPersistentAttributeInterceptable( entity ).$$_hibernate_getInterceptor();
interceptor.readObject( entity, attributeName, null );
}
}

/**
* If the given object is not a proxy, return it. But, if it is a proxy, ensure
* that the proxy is initialized, and return a direct reference to its proxied
Expand Down
4 changes: 4 additions & 0 deletions hibernate-core/src/main/java/org/hibernate/Session.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import jakarta.persistence.FlushModeType;
import jakarta.persistence.LockModeType;
import jakarta.persistence.PessimisticLockScope;
import jakarta.persistence.TypedQueryReference;
import jakarta.persistence.criteria.CriteriaDelete;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.CriteriaUpdate;
Expand Down Expand Up @@ -1560,6 +1561,9 @@ default LockRequest setLockScope(PessimisticLockScope scope) {
@Override
<R> Query<R> createQuery(String queryString, Class<R> resultClass);

@Override
<R> Query<R> createQuery(TypedQueryReference<R> typedQueryReference);

@Override @Deprecated @SuppressWarnings("rawtypes")
Query createQuery(String queryString);

Expand Down
3 changes: 2 additions & 1 deletion hibernate-core/src/main/java/org/hibernate/Transaction.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import jakarta.persistence.EntityTransaction;
import jakarta.transaction.Synchronization;
import org.checkerframework.checker.nullness.qual.Nullable;

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

Expand Down Expand Up @@ -66,7 +67,7 @@ public interface Transaction extends EntityTransaction {
*
* @return The timeout, in seconds.
*/
int getTimeout();
@Nullable Integer getTimeout();

/**
* Attempt to mark the underlying transaction for rollback only.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

import jakarta.persistence.CacheRetrieveMode;
import jakarta.persistence.CacheStoreMode;
import jakarta.persistence.EntityManager;

import org.hibernate.Remove;

import static java.lang.annotation.ElementType.PACKAGE;
Expand Down Expand Up @@ -47,6 +49,15 @@
*/
String query();

/**
* Optional query result class that is used by default when creating the query.
* May be overridden by explicitly passing a class object to
* {@link EntityManager#createNamedQuery(String, Class)}.
*
* @see jakarta.persistence.NamedQuery#resultClass()
*/
Class<?> resultClass() default void.class;

/**
* The flush mode for this query.
*
Expand Down
8 changes: 4 additions & 4 deletions hibernate-core/src/main/java/org/hibernate/boot/Metadata.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,24 +115,24 @@ public interface Metadata extends Mapping {
*
* @return The named query metadata, or {@code null}.
*/
NamedHqlQueryDefinition getNamedHqlQueryMapping(String name);
NamedHqlQueryDefinition<?> getNamedHqlQueryMapping(String name);

/**
* Visit all named HQL query definitions
*/
void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition> definitionConsumer);
void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition<?>> definitionConsumer);

/**
* Retrieve named SQL query metadata.
*
* @return The named query metadata, or {@code null}
*/
NamedNativeQueryDefinition getNamedNativeQueryMapping(String name);
NamedNativeQueryDefinition<?> getNamedNativeQueryMapping(String name);

/**
* Visit all named native query definitions
*/
void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition> definitionConsumer);
void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition<?>> definitionConsumer);

/**
* Retrieve named procedure metadata.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ public class InFlightMetadataCollectorImpl implements InFlightMetadataCollector,

private Database database;

private final Map<String, NamedHqlQueryDefinition> namedQueryMap = new HashMap<>();
private final Map<String, NamedNativeQueryDefinition> namedNativeQueryMap = new HashMap<>();
private final Map<String, NamedHqlQueryDefinition<?>> namedQueryMap = new HashMap<>();
private final Map<String, NamedNativeQueryDefinition<?>> namedNativeQueryMap = new HashMap<>();
private final Map<String, NamedProcedureCallDefinition> namedProcedureCallMap = new HashMap<>();
private final Map<String, NamedResultSetMappingDescriptor> sqlResultSetMappingMap = new HashMap<>();

Expand Down Expand Up @@ -740,20 +740,20 @@ public void addNamedEntityGraph(NamedEntityGraphDefinition definition) {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Named query handling

public NamedHqlQueryDefinition getNamedHqlQueryMapping(String name) {
public NamedHqlQueryDefinition<?> getNamedHqlQueryMapping(String name) {
if ( name == null ) {
throw new IllegalArgumentException( "null is not a valid query name" );
}
return namedQueryMap.get( name );
}

@Override
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition> definitionConsumer) {
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition<?>> definitionConsumer) {
namedQueryMap.values().forEach( definitionConsumer );
}

@Override
public void addNamedQuery(NamedHqlQueryDefinition def) {
public void addNamedQuery(NamedHqlQueryDefinition<?> def) {
if ( def == null ) {
throw new IllegalArgumentException( "Named query definition is null" );
}
Expand All @@ -768,7 +768,7 @@ else if ( def.getRegistrationName() == null ) {
applyNamedQuery( def.getRegistrationName(), def );
}

private void applyNamedQuery(String name, NamedHqlQueryDefinition query) {
private void applyNamedQuery(String name, NamedHqlQueryDefinition<?> query) {
checkQueryName( name );
namedQueryMap.put( name.intern(), query );
}
Expand All @@ -780,7 +780,7 @@ private void checkQueryName(String name) throws DuplicateMappingException {
}

@Override
public void addDefaultQuery(NamedHqlQueryDefinition queryDefinition) {
public void addDefaultQuery(NamedHqlQueryDefinition<?> queryDefinition) {
applyNamedQuery( queryDefinition.getRegistrationName(), queryDefinition );
defaultNamedQueryNames.add( queryDefinition.getRegistrationName() );
}
Expand All @@ -789,17 +789,17 @@ public void addDefaultQuery(NamedHqlQueryDefinition queryDefinition) {
// Named native-query handling

@Override
public NamedNativeQueryDefinition getNamedNativeQueryMapping(String name) {
public NamedNativeQueryDefinition<?> getNamedNativeQueryMapping(String name) {
return namedNativeQueryMap.get( name );
}

@Override
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition> definitionConsumer) {
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition<?>> definitionConsumer) {
namedNativeQueryMap.values().forEach( definitionConsumer );
}

@Override
public void addNamedNativeQuery(NamedNativeQueryDefinition def) {
public void addNamedNativeQuery(NamedNativeQueryDefinition<?> def) {
if ( def == null ) {
throw new IllegalArgumentException( "Named native query definition object is null" );
}
Expand All @@ -814,13 +814,13 @@ public void addNamedNativeQuery(NamedNativeQueryDefinition def) {
applyNamedNativeQuery( def.getRegistrationName(), def );
}

private void applyNamedNativeQuery(String name, NamedNativeQueryDefinition query) {
private void applyNamedNativeQuery(String name, NamedNativeQueryDefinition<?> query) {
checkQueryName( name );
namedNativeQueryMap.put( name.intern(), query );
}

@Override
public void addDefaultNamedNativeQuery(NamedNativeQueryDefinition query) {
public void addDefaultNamedNativeQuery(NamedNativeQueryDefinition<?> query) {
applyNamedNativeQuery( query.getRegistrationName(), query );
defaultNamedNativeQueryNames.add( query.getRegistrationName() );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ public class MetadataImpl implements MetadataImplementor, Serializable {
private final Map<String, FetchProfile> fetchProfileMap;
private final Map<String, String> imports;
private final Map<String, IdentifierGeneratorDefinition> idGeneratorDefinitionMap;
private final Map<String, NamedHqlQueryDefinition> namedQueryMap;
private final Map<String, NamedNativeQueryDefinition> namedNativeQueryMap;
private final Map<String, NamedHqlQueryDefinition<?>> namedQueryMap;
private final Map<String, NamedNativeQueryDefinition<?>> namedNativeQueryMap;
private final Map<String, NamedProcedureCallDefinition> namedProcedureCallMap;
private final Map<String, NamedResultSetMappingDescriptor> sqlResultSetMappingMap;
private final Map<String, NamedEntityGraphDefinition> namedEntityGraphMap;
Expand All @@ -118,8 +118,8 @@ public MetadataImpl(
Map<String, FetchProfile> fetchProfileMap,
Map<String, String> imports,
Map<String, IdentifierGeneratorDefinition> idGeneratorDefinitionMap,
Map<String, NamedHqlQueryDefinition> namedQueryMap,
Map<String, NamedNativeQueryDefinition> namedNativeQueryMap,
Map<String, NamedHqlQueryDefinition<?>> namedQueryMap,
Map<String, NamedNativeQueryDefinition<?>> namedNativeQueryMap,
Map<String, NamedProcedureCallDefinition> namedProcedureCallMap,
Map<String, NamedResultSetMappingDescriptor> sqlResultSetMappingMap,
Map<String, NamedEntityGraphDefinition> namedEntityGraphMap,
Expand Down Expand Up @@ -240,22 +240,22 @@ public Map<String, String> getImports() {
}

@Override
public NamedHqlQueryDefinition getNamedHqlQueryMapping(String name) {
public NamedHqlQueryDefinition<?> getNamedHqlQueryMapping(String name) {
return namedQueryMap.get( name );
}

@Override
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition> definitionConsumer) {
public void visitNamedHqlQueryDefinitions(Consumer<NamedHqlQueryDefinition<?>> definitionConsumer) {
namedQueryMap.values().forEach( definitionConsumer );
}

@Override
public NamedNativeQueryDefinition getNamedNativeQueryMapping(String name) {
public NamedNativeQueryDefinition<?> getNamedNativeQueryMapping(String name) {
return namedNativeQueryMap.get( name );
}

@Override
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition> definitionConsumer) {
public void visitNamedNativeQueryDefinitions(Consumer<NamedNativeQueryDefinition<?>> definitionConsumer) {
namedNativeQueryMap.values().forEach( definitionConsumer );
}

Expand Down Expand Up @@ -364,16 +364,16 @@ public NamedObjectRepository buildNamedQueryRepository(SessionFactoryImplementor
);
}

private Map<String, NamedSqmQueryMemento> buildNamedSqmMementos(SessionFactoryImplementor sessionFactory) {
final HashMap<String, NamedSqmQueryMemento> map = new HashMap<>();
private Map<String, NamedSqmQueryMemento<?>> buildNamedSqmMementos(SessionFactoryImplementor sessionFactory) {
final HashMap<String, NamedSqmQueryMemento<?>> map = new HashMap<>();
if ( namedQueryMap != null ) {
namedQueryMap.forEach( (key, value) -> map.put( key, value.resolve( sessionFactory ) ) );
}
return map;
}

private Map<String, NamedNativeQueryMemento> buildNamedNativeMementos(SessionFactoryImplementor sessionFactory) {
final HashMap<String, NamedNativeQueryMemento> map = new HashMap<>();
private Map<String, NamedNativeQueryMemento<?>> buildNamedNativeMementos(SessionFactoryImplementor sessionFactory) {
final HashMap<String, NamedNativeQueryMemento<?>> map = new HashMap<>();
if ( namedNativeQueryMap != null ) {
namedNativeQueryMap.forEach( (key, value) -> map.put( key, value.resolve( sessionFactory ) ) );
}
Expand Down Expand Up @@ -636,11 +636,11 @@ public BootstrapContext getBootstrapContext() {
return bootstrapContext;
}

public Map<String, NamedHqlQueryDefinition> getNamedQueryMap() {
public Map<String, NamedHqlQueryDefinition<?>> getNamedQueryMap() {
return namedQueryMap;
}

public Map<String, NamedNativeQueryDefinition> getNamedNativeQueryMap() {
public Map<String, NamedNativeQueryDefinition<?>> getNamedNativeQueryMap() {
return namedNativeQueryMap;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,20 @@
import org.hibernate.query.hql.internal.NamedHqlQueryMementoImpl;
import org.hibernate.query.sqm.spi.NamedSqmQueryMemento;

import org.checkerframework.checker.nullness.qual.Nullable;

/**
* @author Steve Ebersole
*/
public class NamedHqlQueryDefinitionImpl extends AbstractNamedQueryDefinition implements NamedHqlQueryDefinition {
public class NamedHqlQueryDefinitionImpl<E> extends AbstractNamedQueryDefinition<E> implements NamedHqlQueryDefinition<E> {
private final String hqlString;
private final Integer firstResult;
private final Integer maxResults;
private final Map<String, String> parameterTypes;

public NamedHqlQueryDefinitionImpl(
String name,
@Nullable Class<E> resultType,
String hqlString,
Integer firstResult,
Integer maxResults,
Expand All @@ -44,6 +47,7 @@ public NamedHqlQueryDefinitionImpl(
Map<String,Object> hints) {
super(
name,
resultType,
cacheable,
cacheRegion,
cacheMode,
Expand All @@ -67,9 +71,10 @@ public String getHqlString() {
}

@Override
public NamedSqmQueryMemento resolve(SessionFactoryImplementor factory) {
return new NamedHqlQueryMementoImpl(
public NamedSqmQueryMemento<E> resolve(SessionFactoryImplementor factory) {
return new NamedHqlQueryMementoImpl<>(
getRegistrationName(),
getResultType(),
hqlString,
firstResult,
maxResults,
Expand Down

0 comments on commit 2dddf6c

Please sign in to comment.