HHH-13720: Implement mapping model support for plural attributes - sorted set;

HHH-13715: HQL/Criteria DELETE support - support for cleaning-up collection tables
This commit is contained in:
Steve Ebersole 2019-11-27 12:06:21 -06:00
parent 7b489b180c
commit 75d436ab25
34 changed files with 1312 additions and 1114 deletions

View File

@ -0,0 +1,87 @@
/*
* 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.metamodel.mapping;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.SqlTuple;
import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey;
/**
* @author Steve Ebersole
*/
public class MappingModelHelper {
public static Expression buildColumnReferenceExpression(
ModelPart modelPart,
SqlExpressionResolver sqlExpressionResolver,
SessionFactoryImplementor sessionFactory) {
final int jdbcTypeCount = modelPart.getJdbcTypeCount( sessionFactory.getTypeConfiguration() );
if ( jdbcTypeCount == 1 ) {
assert modelPart instanceof BasicValuedModelPart;
final BasicValuedModelPart basicPart = (BasicValuedModelPart) modelPart;
if ( sqlExpressionResolver == null ) {
return new ColumnReference(
basicPart.getContainingTableExpression(),
basicPart.getMappedColumnExpression(),
basicPart.getJdbcMapping(),
sessionFactory
);
}
else {
return sqlExpressionResolver.resolveSqlExpression(
createColumnReferenceKey( basicPart.getContainingTableExpression(), basicPart.getMappedColumnExpression() ),
sqlAstProcessingState -> new ColumnReference(
basicPart.getContainingTableExpression(),
basicPart.getMappedColumnExpression(),
basicPart.getJdbcMapping(),
sessionFactory
)
);
}
}
else {
final List<ColumnReference> columnReferences = new ArrayList<>( jdbcTypeCount );
modelPart.visitColumns(
(containingTableExpression, columnExpression, jdbcMapping) -> {
final ColumnReference colRef;
if ( sqlExpressionResolver == null ) {
colRef = new ColumnReference(
containingTableExpression,
columnExpression,
jdbcMapping,
sessionFactory
);
}
else {
colRef = (ColumnReference) sqlExpressionResolver.resolveSqlExpression(
createColumnReferenceKey( containingTableExpression, columnExpression ),
sqlAstProcessingState -> new ColumnReference(
containingTableExpression,
columnExpression,
jdbcMapping,
sessionFactory
)
);
}
columnReferences.add( colRef );
}
);
return new SqlTuple( columnReferences, modelPart );
}
}
private MappingModelHelper() {
// disallow direct instantiation
}
}

View File

@ -6,9 +6,12 @@
*/
package org.hibernate.query.hql.internal;
import java.util.Locale;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.query.NavigablePath;
import org.hibernate.query.SemanticException;
import org.hibernate.query.hql.HqlInterpretationException;
import org.hibernate.query.hql.spi.DotIdentifierConsumer;
import org.hibernate.query.hql.spi.SemanticPathPart;
import org.hibernate.query.hql.spi.SqmPathRegistry;
@ -139,6 +142,16 @@ public class QualifiedJoinPathConsumer implements DotIdentifierConsumer {
boolean isTerminal,
SqmCreationState creationState) {
final SqmPathSource subPathSource = lhs.getReferencedPathSource().findSubPathSource( name );
if ( subPathSource == null ) {
throw new HqlInterpretationException(
String.format(
Locale.ROOT,
"Could not locate specified joinable path : %s -> %s",
lhs.getNavigablePath(),
name
)
);
}
final SqmAttributeJoin join = ( (SqmJoinable) subPathSource ).createSqmJoin(
lhs,
joinType,

View File

@ -542,7 +542,7 @@ public class QuerySqmImpl<R>
final SqmMultiTableMutationStrategy multiTableStrategy = entityDescriptor.getSqmMultiTableMutationStrategy();
if ( multiTableStrategy == null ) {
return new SimpleDeleteQueryPlan( sqmDelete, domainParameterXref );
return new SimpleDeleteQueryPlan( entityDescriptor, sqmDelete, domainParameterXref );
}
else {
return new MultiTableDeleteQueryPlan( sqmDelete, domainParameterXref, multiTableStrategy );

View File

@ -12,9 +12,14 @@ import java.util.Map;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.MappingModelHelper;
import org.hibernate.query.NavigablePath;
import org.hibernate.query.spi.NonSelectQueryPlan;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.spi.QueryParameterImplementor;
import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper;
import org.hibernate.query.sqm.sql.SimpleSqmDeleteTranslation;
import org.hibernate.query.sqm.sql.SimpleSqmDeleteTranslator;
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
@ -22,26 +27,36 @@ import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.SqlAstDeleteTranslator;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.from.MutatingTableReferenceGroupWrapper;
import org.hibernate.sql.ast.tree.from.StandardTableGroup;
import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate;
import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcDelete;
import org.hibernate.sql.exec.spi.JdbcParameter;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.results.internal.SqlSelectionImpl;
/**
* @author Steve Ebersole
*/
public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
private final EntityMappingType entityDescriptor;
private final SqmDeleteStatement sqmDelete;
private final DomainParameterXref domainParameterXref;
private JdbcDelete jdbcDelete;
private FromClauseAccess tableGroupAccess;
private SimpleSqmDeleteTranslation sqmInterpretation;
private Map<QueryParameterImplementor<?>, Map<SqmParameter, List<JdbcParameter>>> jdbcParamsXref;
public SimpleDeleteQueryPlan(
EntityMappingType entityDescriptor,
SqmDeleteStatement sqmDelete,
DomainParameterXref domainParameterXref) {
assert entityDescriptor.getEntityName().equals( sqmDelete.getTarget().getEntityName() );
this.entityDescriptor = entityDescriptor;
this.sqmDelete = sqmDelete;
this.domainParameterXref = domainParameterXref;
}
@ -63,9 +78,7 @@ public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
factory
);
final SimpleSqmDeleteTranslation sqmInterpretation = translator.translate( sqmDelete );
tableGroupAccess = translator.getFromClauseAccess();
sqmInterpretation = translator.translate( sqmDelete );
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
@ -78,7 +91,6 @@ public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
domainParameterXref,
sqmInterpretation::getJdbcParamsBySqmParam
);
}
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
@ -86,10 +98,57 @@ public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
domainParameterXref,
jdbcParamsXref,
factory.getDomainModel(),
tableGroupAccess::findTableGroup,
sqmInterpretation.getFromClauseAccess()::findTableGroup,
executionContext.getSession()
);
final boolean missingRestriction = sqmDelete.getWhereClause() == null
|| sqmDelete.getWhereClause().getPredicate() == null;
if ( missingRestriction ) {
assert domainParameterXref.getSqmParameterCount() == 0;
assert jdbcParamsXref.isEmpty();
assert jdbcParameterBindings.getBindings().size() == 0;
}
SqmMutationStrategyHelper.cleanUpCollectionTables(
entityDescriptor,
(tableReference, attributeMapping) -> {
if ( missingRestriction ) {
return null;
}
final ForeignKeyDescriptor fkDescriptor = attributeMapping.getKeyDescriptor();
final Expression fkColumnExpression = MappingModelHelper.buildColumnReferenceExpression(
fkDescriptor,
null,
factory
);
final QuerySpec matchingIdSubQuery = new QuerySpec( false );
final Expression fkTargetColumnExpression = MappingModelHelper.buildColumnReferenceExpression(
fkDescriptor,
sqmInterpretation.getSqlExpressionResolver(),
factory
);
matchingIdSubQuery.getSelectClause().addSqlSelection( new SqlSelectionImpl( 1, 0, fkTargetColumnExpression, null ) );
matchingIdSubQuery.getFromClause().addRoot(
new MutatingTableReferenceGroupWrapper(
new NavigablePath( attributeMapping.getRootPathName() ),
attributeMapping,
sqmInterpretation.getSqlAst().getTargetTable()
)
);
matchingIdSubQuery.applyPredicate( sqmInterpretation.getSqlAst().getRestriction() );
return new InSubQueryPredicate( fkColumnExpression, matchingIdSubQuery, false );
},
missingRestriction ? JdbcParameterBindings.NO_BINDINGS : jdbcParameterBindings,
executionContext
);
return jdbcServices.getJdbcMutationExecutor().execute(
jdbcDelete,
jdbcParameterBindings,

View File

@ -6,14 +6,30 @@
*/
package org.hibernate.query.sqm.mutation.internal;
import java.util.function.BiFunction;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.boot.spi.SessionFactoryOptions;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.CascadeStyle;
import org.hibernate.engine.spi.CascadingActions;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.mapping.RootClass;
import org.hibernate.metamodel.mapping.AttributeMapping;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
import org.hibernate.sql.ast.SqlAstDeleteTranslator;
import org.hibernate.sql.ast.tree.delete.DeleteStatement;
import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.ast.tree.predicate.Predicate;
import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
/**
* @author Steve Ebersole
@ -52,4 +68,70 @@ public class SqmMutationStrategyHelper {
.getFallbackSqmMutationStrategy( rootEntityDescriptor, creationContext );
}
public static void cleanUpCollectionTables(
EntityMappingType entityDescriptor,
BiFunction<TableReference, PluralAttributeMapping, Predicate> restrictionProducer,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext) {
if ( ! entityDescriptor.getEntityPersister().hasCollections() ) {
// none to clean-up
return;
}
entityDescriptor.visitAttributeMappings(
attributeMapping -> {
if ( attributeMapping instanceof PluralAttributeMapping ) {
cleanUpCollectionTable(
(PluralAttributeMapping) attributeMapping,
entityDescriptor,
restrictionProducer,
jdbcParameterBindings,
executionContext
);
}
}
);
}
private static void cleanUpCollectionTable(
PluralAttributeMapping attributeMapping,
EntityMappingType entityDescriptor,
BiFunction<TableReference, PluralAttributeMapping, Predicate> restrictionProducer,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext) {
final String separateCollectionTable = attributeMapping.getSeparateCollectionTable();
final SessionFactoryImplementor sessionFactory = executionContext.getSession().getFactory();
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
if ( separateCollectionTable == null ) {
// one-to-many - update the matching rows in the associated table setting the fk column(s) to null
// not yet implemented - do nothing
}
else {
// element-collection or many-to-many - delete the collection-table row
final TableReference tableReference = new TableReference( separateCollectionTable, null, true, sessionFactory );
final DeleteStatement sqlAstDelete = new DeleteStatement(
tableReference,
restrictionProducer.apply( tableReference, attributeMapping )
);
final SqlAstDeleteTranslator sqlAstDeleteTranslator = jdbcServices.getJdbcEnvironment()
.getSqlAstTranslatorFactory()
.buildDeleteTranslator( sessionFactory );
jdbcServices.getJdbcMutationExecutor().execute(
sqlAstDeleteTranslator.translate( sqlAstDelete ),
jdbcParameterBindings,
sql -> executionContext.getSession()
.getJdbcCoordinator()
.getStatementPreparer()
.prepareStatement( sql ),
(integer, preparedStatement) -> {},
executionContext
);
}
}
}

View File

@ -23,13 +23,17 @@ import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.metamodel.mapping.ColumnConsumer;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.MappingModelHelper;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.Joinable;
import org.hibernate.query.NavigablePath;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.query.spi.QueryParameterBindings;
import org.hibernate.query.sqm.internal.DomainParameterXref;
import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter;
import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper;
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.SqlAstDeleteTranslator;
@ -38,6 +42,7 @@ import org.hibernate.sql.ast.tree.delete.DeleteStatement;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.SqlTuple;
import org.hibernate.sql.ast.tree.from.MutatingTableReferenceGroupWrapper;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate;
@ -47,6 +52,7 @@ import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcDelete;
import org.hibernate.sql.exec.spi.JdbcParameter;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.results.internal.SqlSelectionImpl;
import org.jboss.logging.Logger;
@ -392,6 +398,26 @@ public class RestrictedDeleteExecutionDelegate implements TableBasedDeleteHandle
executionContext
);
SqmMutationStrategyHelper.cleanUpCollectionTables(
entityDescriptor,
(tableReference, attributeMapping) -> {
final ForeignKeyDescriptor fkDescriptor = attributeMapping.getKeyDescriptor();
return new InSubQueryPredicate(
MappingModelHelper.buildColumnReferenceExpression(
fkDescriptor,
null,
sessionFactory
),
idTableSubQuery,
false
);
},
JdbcParameterBindings.NO_BINDINGS,
executionContext
);
entityDescriptor.visitConstraintOrderedTables(
(tableExpression, tableKeyColumnVisitationSupplier) -> deleteFromTableUsingIdTable(
tableExpression,

View File

@ -12,6 +12,7 @@ import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper;
import org.hibernate.sql.ast.SqlAstDeleteTranslator;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.delete.DeleteStatement;
@ -37,6 +38,13 @@ public class UnrestrictedDeleteExecutionDelegate implements TableBasedDeleteHand
// will visit
final AtomicInteger result = new AtomicInteger();
SqmMutationStrategyHelper.cleanUpCollectionTables(
entityDescriptor,
(tableReference, attributeMapping) -> null,
JdbcParameterBindings.NO_BINDINGS,
executionContext
);
entityDescriptor.visitConstraintOrderedTables(
(tableExpression, tableKeyColumnsVisitationSupplier) -> {
final int rows = deleteFrom( tableExpression, executionContext );

View File

@ -10,6 +10,8 @@ import java.util.List;
import java.util.Map;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.tree.delete.DeleteStatement;
import org.hibernate.sql.exec.spi.JdbcParameter;
@ -19,12 +21,18 @@ import org.hibernate.sql.exec.spi.JdbcParameter;
public class SimpleSqmDeleteTranslation implements SqmTranslation {
private final DeleteStatement sqlAst;
private final Map<SqmParameter, List<JdbcParameter>> jdbcParamMap;
private final SqlExpressionResolver sqlExpressionResolver;
private final FromClauseAccess fromClauseAccess;
public SimpleSqmDeleteTranslation(
DeleteStatement sqlAst,
Map<SqmParameter, List<JdbcParameter>> jdbcParamMap) {
Map<SqmParameter, List<JdbcParameter>> jdbcParamMap,
SqlExpressionResolver sqlExpressionResolver,
FromClauseAccess fromClauseAccess) {
this.sqlAst = sqlAst;
this.jdbcParamMap = jdbcParamMap;
this.sqlExpressionResolver = sqlExpressionResolver;
this.fromClauseAccess = fromClauseAccess;
}
@Override
@ -36,4 +44,12 @@ public class SimpleSqmDeleteTranslation implements SqmTranslation {
public Map<SqmParameter, List<JdbcParameter>> getJdbcParamsBySqmParam() {
return jdbcParamMap;
}
public SqlExpressionResolver getSqlExpressionResolver() {
return sqlExpressionResolver;
}
public FromClauseAccess getFromClauseAccess() {
return fromClauseAccess;
}
}

View File

@ -53,10 +53,21 @@ public class StandardSqmDeleteTranslator
@Override
public SimpleSqmDeleteTranslation translate(SqmDeleteStatement statement) {
SqlAstProcessingStateImpl processingState = new SqlAstProcessingStateImpl(
null,
this,
getCurrentClauseStack()::getCurrent
);
getProcessingStateStack().push( processingState );
final DeleteStatement deleteStatement = visitDeleteStatement( statement );
return new SimpleSqmDeleteTranslation(
deleteStatement,
getJdbcParamsBySqmParam()
getJdbcParamsBySqmParam(),
processingState.getSqlExpressionResolver(),
getFromClauseAccess()
);
}
@ -66,14 +77,6 @@ public class StandardSqmDeleteTranslator
final EntityPersister entityDescriptor = getCreationContext().getDomainModel().getEntityDescriptor( entityName );
assert entityDescriptor != null;
getProcessingStateStack().push(
new SqlAstProcessingStateImpl(
null,
this,
getCurrentClauseStack()::getCurrent
)
);
try {
final NavigablePath rootPath = new NavigablePath( entityName );
final TableGroup rootTableGroup = entityDescriptor.createRootTableGroup(

View File

@ -0,0 +1,111 @@
/*
* 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.sql.ast.tree.from;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.hibernate.LockMode;
import org.hibernate.metamodel.mapping.ModelPartContainer;
import org.hibernate.query.NavigablePath;
/**
* @author Steve Ebersole
*/
public class MutatingTableReferenceGroupWrapper implements VirtualTableGroup {
private final NavigablePath navigablePath;
private final ModelPartContainer modelPart;
private final TableReference mutatingTableReference;
public MutatingTableReferenceGroupWrapper(
NavigablePath navigablePath,
ModelPartContainer modelPart,
TableReference mutatingTableReference) {
this.navigablePath = navigablePath;
this.modelPart = modelPart;
this.mutatingTableReference = mutatingTableReference;
}
@Override
public NavigablePath getNavigablePath() {
return navigablePath;
}
@Override
public String getGroupAlias() {
return null;
}
@Override
public ModelPartContainer getModelPart() {
return modelPart;
}
@Override
public TableReference getPrimaryTableReference() {
return mutatingTableReference;
}
@Override
public TableReference resolveTableReference(String tableExpression, Supplier<TableReference> creator) {
return resolveTableReference( tableExpression );
}
@Override
public TableReference resolveTableReference(String tableExpression) {
return mutatingTableReference.getTableExpression().equals( tableExpression )
? mutatingTableReference
: null;
}
@Override
public void applyAffectedTableNames(Consumer<String> nameCollector) {
nameCollector.accept( mutatingTableReference.getTableExpression() );
}
@Override
public LockMode getLockMode() {
return LockMode.WRITE;
}
@Override
public Set<TableGroupJoin> getTableGroupJoins() {
return Collections.emptySet();
}
@Override
public boolean hasTableGroupJoins() {
return false;
}
@Override
public void setTableGroupJoins(Set<TableGroupJoin> joins) {
throw new UnsupportedOperationException();
}
@Override
public void addTableGroupJoin(TableGroupJoin join) {
throw new UnsupportedOperationException();
}
@Override
public void visitTableGroupJoins(Consumer<TableGroupJoin> consumer) {
}
@Override
public List<TableReferenceJoin> getTableReferenceJoins() {
return Collections.emptyList();
}
@Override
public boolean isInnerJoinPossible() {
return false;
}
}

View File

@ -6,9 +6,9 @@
*/
package org.hibernate.orm.test.loading.multiLoad;
import java.util.Collection;
import java.util.List;
import org.hibernate.testing.hamcrest.CollectionMatchers;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.domain.gambit.BasicEntity;
import org.hibernate.testing.orm.domain.gambit.EntityWithAggregateId;
@ -16,17 +16,12 @@ import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryFunctionalTesting;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.hamcrest.BaseMatcher;
import org.hamcrest.CoreMatchers;
import org.hamcrest.Description;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
/**
@ -132,7 +127,7 @@ public class MultiIdEntityLoadTests {
assertThat(
results,
HasNullElementsMatcher.hasNoNullElements()
CollectionMatchers.hasNoNullElements()
);
}
@ -147,7 +142,7 @@ public class MultiIdEntityLoadTests {
// however, we should now have a null element for the deleted entity
assertThat(
results,
HasNullElementsMatcher.hasNullElements()
CollectionMatchers.hasNullElements()
);
}
}
@ -206,52 +201,4 @@ public class MultiIdEntityLoadTests {
);
}
private static class HasNullElementsMatcher<C extends Collection<?>> extends BaseMatcher<C> {
public static final HasNullElementsMatcher INSTANCE = new HasNullElementsMatcher( false );
public static final HasNullElementsMatcher NEGATED_INSTANCE = new HasNullElementsMatcher( true );
public static <X extends Collection<?>> HasNullElementsMatcher<X> hasNullElements() {
//noinspection unchecked
return INSTANCE;
}
public static <X extends Collection<?>> HasNullElementsMatcher<X> hasNoNullElements() {
//noinspection unchecked
return NEGATED_INSTANCE;
}
private final boolean negated;
public HasNullElementsMatcher(boolean negated) {
this.negated = negated;
}
@Override
public boolean matches(Object item) {
assertThat( item, instanceOf( Collection.class ) );
//noinspection unchecked
C collection = (C) item;
if ( negated ) {
// check no-null-elements - if any is null, this check fails
collection.forEach( e -> assertThat( e, notNullValue() ) );
return true;
}
boolean foundOne = false;
for ( Object e : collection ) {
if ( e == null ) {
foundOne = true;
break;
}
}
return foundOne;
}
@Override
public void describeTo(Description description) {
description.appendText( "had null elements" );
}
}
}

View File

@ -1,148 +0,0 @@
/*
* 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.orm.test.metamodel.mapping.collections;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Convert;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
/**
* @author Steve Ebersole
*/
@Entity(name = "EntityContainingLists")
@Table(name = "entity_containing_lists")
public class EntityContainingLists {
private Integer id;
private String name;
private List<String> listOfBasics;
private List<EnumValue> listOfConvertedBasics;
private List<EnumValue> listOfEnums;
private List<SomeStuff> listOfComponents;
private List<SimpleEntity> listOfEntities;
public EntityContainingLists() {
}
public EntityContainingLists(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ElementCollection
@OrderColumn
public List<String> getListOfBasics() {
return listOfBasics;
}
public void setListOfBasics(List<String> listOfBasics) {
this.listOfBasics = listOfBasics;
}
public void addBasic(String basic) {
if ( listOfBasics == null ) {
listOfBasics = new ArrayList<>();
}
listOfBasics.add( basic );
}
@ElementCollection
@OrderColumn
@Convert(converter = EnumValueConverter.class)
public List<EnumValue> getListOfConvertedBasics() {
return listOfConvertedBasics;
}
public void setListOfConvertedBasics(List<EnumValue> listOfConvertedBasics) {
this.listOfConvertedBasics = listOfConvertedBasics;
}
public void addConvertedBasic(EnumValue value) {
if ( listOfConvertedBasics == null ) {
listOfConvertedBasics = new ArrayList<>();
}
listOfConvertedBasics.add( value );
}
@ElementCollection
@Enumerated(EnumType.STRING)
@OrderColumn
public List<EnumValue> getListOfEnums() {
return listOfEnums;
}
public void setListOfEnums(List<EnumValue> listOfEnums) {
this.listOfEnums = listOfEnums;
}
public void addEnum(EnumValue value) {
if ( listOfEnums == null ) {
listOfEnums = new ArrayList<>();
}
listOfEnums.add( value );
}
@ElementCollection
@OrderColumn
public List<SomeStuff> getListOfComponents() {
return listOfComponents;
}
public void setListOfComponents(List<SomeStuff> listOfComponents) {
this.listOfComponents = listOfComponents;
}
public void addComponent(SomeStuff value) {
if ( listOfComponents == null ) {
listOfComponents = new ArrayList<>();
}
listOfComponents.add( value );
}
@OneToMany(cascade = CascadeType.ALL)
@OrderColumn
public List<SimpleEntity> getListOfEntities() {
return listOfEntities;
}
public void setListOfEntities(List<SimpleEntity> listOfEntities) {
this.listOfEntities = listOfEntities;
}
public void addSimpleEntity(SimpleEntity value) {
if ( listOfEntities == null ) {
listOfEntities = new ArrayList<>();
}
listOfEntities.add( value );
}
}

View File

@ -1,206 +0,0 @@
/*
* 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.orm.test.metamodel.mapping.collections;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.MapKeyColumn;
import javax.persistence.MapKeyEnumerated;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* @author Steve Ebersole
*/
@SuppressWarnings("unused")
@Entity
@Table(name = "entity_containing_maps")
public class EntityContainingMaps {
private Integer id;
private String name;
private Map<String,String> basicByBasic;
private Map<EnumValue,String> basicByEnum;
private Map<EnumValue,String> basicByConvertedEnum;
private Map<String,SomeStuff> someStuffByBasic;
private Map<SomeStuff, String> basicBySomeStuff;
private Map<String,SimpleEntity> oneToManyByBasic;
private Map<SimpleEntity,String> basicByOneToMany;
private Map<String,SimpleEntity> manyToManyByBasic;
public EntityContainingMaps() {
}
public EntityContainingMaps(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ElementCollection
@MapKeyColumn( name = "map_key" )
@Column( name = "map_val")
public Map<String, String> getBasicByBasic() {
return basicByBasic;
}
public void setBasicByBasic(Map<String, String> basicByBasic) {
this.basicByBasic = basicByBasic;
}
public void addBasicByBasic(String key, String val) {
if ( basicByBasic == null ) {
basicByBasic = new HashMap<>();
}
basicByBasic.put( key, val );
}
@ElementCollection
@MapKeyEnumerated
public Map<EnumValue, String> getBasicByEnum() {
return basicByEnum;
}
public void setBasicByEnum(Map<EnumValue, String> basicByEnum) {
this.basicByEnum = basicByEnum;
}
public void addBasicByEnum(EnumValue key, String val) {
if ( basicByEnum == null ) {
basicByEnum = new HashMap<>();
}
basicByEnum.put( key, val );
}
@ElementCollection
@Convert(attributeName = "key", converter = EnumValueConverter.class)
public Map<EnumValue, String> getBasicByConvertedEnum() {
return basicByConvertedEnum;
}
public void setBasicByConvertedEnum(Map<EnumValue, String> basicByConvertedEnum) {
this.basicByConvertedEnum = basicByConvertedEnum;
}
public void addBasicByConvertedEnum(EnumValue key, String value) {
if ( basicByConvertedEnum == null ) {
basicByConvertedEnum = new HashMap<>();
}
basicByConvertedEnum.put( key, value );
}
@ElementCollection
public Map<String, SomeStuff> getSomeStuffByBasic() {
return someStuffByBasic;
}
public void setSomeStuffByBasic(Map<String, SomeStuff> someStuffByBasic) {
this.someStuffByBasic = someStuffByBasic;
}
public void addSomeStuffByBasic(String key, SomeStuff value) {
if ( someStuffByBasic == null ) {
someStuffByBasic = new HashMap<>();
}
someStuffByBasic.put( key, value );
}
@ElementCollection
public Map<SomeStuff, String> getBasicBySomeStuff() {
return basicBySomeStuff;
}
public void setBasicBySomeStuff(Map<SomeStuff, String> basicBySomeStuff) {
this.basicBySomeStuff = basicBySomeStuff;
}
public void addBasicBySomeStuff(SomeStuff key, String val) {
if ( basicBySomeStuff == null ) {
basicBySomeStuff = new HashMap<>();
}
basicBySomeStuff.put( key, val );
}
@OneToMany
public Map<String, SimpleEntity> getOneToManyByBasic() {
return oneToManyByBasic;
}
public void setOneToManyByBasic(Map<String, SimpleEntity> oneToManyByBasic) {
this.oneToManyByBasic = oneToManyByBasic;
}
public void addOneToManyByBasic(String key, SimpleEntity val) {
if ( oneToManyByBasic == null ) {
oneToManyByBasic = new HashMap<>();
}
oneToManyByBasic.put( key, val );
}
// todo (6.0) : add support for using an entity as map key
// see `org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper#interpretMapKey`
@ElementCollection
public Map<SimpleEntity, String> getBasicByOneToMany() {
return basicByOneToMany;
}
public void setBasicByOneToMany(Map<SimpleEntity, String> basicByOneToMany) {
this.basicByOneToMany = basicByOneToMany;
}
public void addOneToManyByBasic(SimpleEntity key, String val) {
if ( basicByOneToMany == null ) {
basicByOneToMany = new HashMap<>();
}
basicByOneToMany.put( key, val );
}
@ManyToMany
@CollectionTable( name = "m2m_by_basic" )
public Map<String, SimpleEntity> getManyToManyByBasic() {
return manyToManyByBasic;
}
public void setManyToManyByBasic(Map<String, SimpleEntity> manyToManyByBasic) {
this.manyToManyByBasic = manyToManyByBasic;
}
public void addManyToManyByBasic(String key, SimpleEntity val) {
if ( manyToManyByBasic == null ) {
manyToManyByBasic = new HashMap<>();
}
manyToManyByBasic.put( key, val );
}
}

View File

@ -1,169 +0,0 @@
/*
* 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.orm.test.metamodel.mapping.collections;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Convert;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.SortNatural;
/**
* @author Steve Ebersole
*/
@Entity(name = "EntityContainingSets")
@Table(name = "entity_containing_sets")
public class EntityContainingSets {
private Integer id;
private String name;
private Set<String> setOfBasics;
private Set<EnumValue> setOfConvertedBasics;
private Set<EnumValue> setOfEnums;
private Set<SomeStuff> setOfComponents;
private Set<SimpleEntity> setOfEntities;
private SortedSet<String> sortedSetOfBasics;
public EntityContainingSets() {
}
public EntityContainingSets(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ElementCollection
public Set<String> getSetOfBasics() {
return setOfBasics;
}
public void setSetOfBasics(Set<String> setOfBasics) {
this.setOfBasics = setOfBasics;
}
public void addBasic(String value) {
if ( setOfBasics == null ) {
setOfBasics = new HashSet<>();
}
setOfBasics.add( value );
}
@ElementCollection
@Convert(converter = EnumValueConverter.class)
public Set<EnumValue> getSetOfConvertedBasics() {
return setOfConvertedBasics;
}
public void setSetOfConvertedBasics(Set<EnumValue> setOfConvertedBasics) {
this.setOfConvertedBasics = setOfConvertedBasics;
}
public void addConvertedBasic(EnumValue value) {
if ( setOfConvertedBasics == null ) {
setOfConvertedBasics = new HashSet<>();
}
setOfConvertedBasics.add( value );
}
@ElementCollection
@Enumerated(EnumType.STRING)
public Set<EnumValue> getSetOfEnums() {
return setOfEnums;
}
public void setSetOfEnums(Set<EnumValue> setOfEnums) {
this.setOfEnums = setOfEnums;
}
public void addEnum(EnumValue value) {
if ( setOfEnums == null ) {
setOfEnums = new HashSet<>();
}
setOfEnums.add( value );
}
@ElementCollection
@Embedded
public Set<SomeStuff> getSetOfComponents() {
return setOfComponents;
}
public void setSetOfComponents(Set<SomeStuff> setOfComponents) {
this.setOfComponents = setOfComponents;
}
public void addComponent(SomeStuff value) {
if ( setOfComponents == null ) {
setOfComponents = new HashSet<>();
}
setOfComponents.add( value );
}
@OneToMany(cascade = CascadeType.ALL)
public Set<SimpleEntity> getSetOfEntities() {
return setOfEntities;
}
public void setSetOfEntities(Set<SimpleEntity> setOfEntities) {
this.setOfEntities = setOfEntities;
}
public void addSimpleEntity(SimpleEntity value) {
if ( setOfEntities == null ) {
setOfEntities = new HashSet<>();
}
setOfEntities.add( value );
}
@ElementCollection()
@CollectionTable( name = "EntityOfSet_sortedBasics")
@SortNatural
public SortedSet<String> getSortedSetOfBasics() {
return sortedSetOfBasics;
}
public void setSortedSetOfBasics(SortedSet<String> sortedSetOfBasics) {
this.sortedSetOfBasics = sortedSetOfBasics;
}
public void addSortedBasic(String value) {
if ( sortedSetOfBasics == null ) {
sortedSetOfBasics = new TreeSet<>();
}
sortedSetOfBasics.add( value );
}
}

View File

@ -0,0 +1,130 @@
/*
* 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.orm.test.metamodel.mapping.collections;
import org.hibernate.Hibernate;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.domain.gambit.EntityOfLists;
import org.hibernate.testing.orm.domain.gambit.EnumValue;
import org.hibernate.testing.orm.domain.gambit.SimpleComponent;
import org.hibernate.testing.orm.domain.gambit.SimpleEntity;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author Steve Ebersole
*/
@SuppressWarnings("WeakerAccess")
@DomainModel( standardModels = StandardDomainModel.GAMBIT )
@ServiceRegistry
@SessionFactory
public class ListOperationTests {
@BeforeEach
public void createTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityOfLists entityContainingLists = new EntityOfLists( 1, "first" );
entityContainingLists.addBasic( "abc" );
entityContainingLists.addBasic( "def" );
entityContainingLists.addBasic( "ghi" );
entityContainingLists.addConvertedEnum( EnumValue.TWO );
entityContainingLists.addEnum( EnumValue.ONE );
entityContainingLists.addEnum( EnumValue.THREE );
entityContainingLists.addComponent( new SimpleComponent( "first-a1", "first-another-a1" ) );
entityContainingLists.addComponent( new SimpleComponent( "first-a2", "first-another-a2" ) );
session.save( entityContainingLists );
}
);
}
@AfterEach
public void dropTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
session.createQuery( "delete from EntityOfLists" ).executeUpdate();
session.createQuery( "delete from SimpleEntity" ).executeUpdate();
}
);
}
@Test
public void listBaselineTest(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final QueryImplementor<EntityOfLists> query = session.createQuery(
"select e from EntityOfLists e",
EntityOfLists.class
);
final EntityOfLists result = query.uniqueResult();
assertThat( result, notNullValue() );
assertThat( result.getListOfBasics(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfBasics() ), is( false ) );
}
);
}
@Test
public void listEagerBasicTest(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final QueryImplementor<EntityOfLists> query = session.createQuery(
"select e from EntityOfLists e join fetch e.listOfBasics",
EntityOfLists.class
);
final EntityOfLists result = query.uniqueResult();
assertThat( result, notNullValue() );
assertThat( result.getListOfBasics(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfBasics() ), is( true ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfBasics() ) );
assertThat( result.getListOfBasics().size(), is( 3 ) );
assertThat( result.getListOfConvertedEnums(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfConvertedEnums() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfConvertedEnums() ) );
assertThat( result.getListOfEnums(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfEnums() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfEnums() ) );
assertThat( result.getListOfComponents(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfComponents() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfComponents() ) );
assertThat( result.getListOfOneToMany(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfOneToMany() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfOneToMany() ) );
assertThat( result.getListOfManyToMany(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfManyToMany() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfManyToMany() ) );
}
);
}
}

View File

@ -8,9 +8,12 @@ package org.hibernate.orm.test.metamodel.mapping.collections;
import org.hibernate.Hibernate;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.domain.gambit.EntityOfMaps;
import org.hibernate.testing.orm.domain.gambit.EnumValue;
import org.hibernate.testing.orm.domain.gambit.SimpleComponent;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.DomainModelScope;
import org.hibernate.testing.orm.junit.FailureExpected;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@ -22,13 +25,7 @@ import org.junit.jupiter.api.Test;
* @author Steve Ebersole
*/
@SuppressWarnings("WeakerAccess")
@DomainModel(
annotatedClasses = {
SimpleEntity.class,
EntityContainingMaps.class,
SomeStuff.class
}
)
@DomainModel( standardModels = StandardDomainModel.GAMBIT )
@ServiceRegistry
@SessionFactory
public class MapOperationTests {
@ -36,7 +33,7 @@ public class MapOperationTests {
public void createData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingMaps entityContainingMaps = new EntityContainingMaps( 1, "first-map-entity" );
final EntityOfMaps entityContainingMaps = new EntityOfMaps( 1, "first-map-entity" );
entityContainingMaps.addBasicByBasic( "someKey", "someValue" );
entityContainingMaps.addBasicByBasic( "anotherKey", "anotherValue" );
@ -45,8 +42,8 @@ public class MapOperationTests {
entityContainingMaps.addBasicByConvertedEnum( EnumValue.THREE, "three" );
entityContainingMaps.addSomeStuffByBasic( "the stuff", new SomeStuff( "the stuff - 1", "the stuff - 2" ) );
entityContainingMaps.addSomeStuffByBasic( "the other stuff", new SomeStuff( "the other stuff - 1", "the other stuff - 2" ) );
entityContainingMaps.addComponentByBasic( "the stuff", new SimpleComponent( "the stuff - 1", "the stuff - 2" ) );
entityContainingMaps.addComponentByBasic( "the other stuff", new SimpleComponent( "the other stuff - 1", "the other stuff - 2" ) );
session.save( entityContainingMaps );
}
@ -60,7 +57,7 @@ public class MapOperationTests {
scope.inTransaction(
session -> {
final EntityContainingMaps entity = session.load( EntityContainingMaps.class, 1 );
final EntityOfMaps entity = session.load( EntityOfMaps.class, 1 );
session.delete( entity );
}
);
@ -74,9 +71,9 @@ public class MapOperationTests {
public void testSqmFetching(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingMaps entity = session.createQuery(
"select e from EntityContainingMaps e join fetch e.basicByEnum",
EntityContainingMaps.class
final EntityOfMaps entity = session.createQuery(
"select e from EntityOfMaps e join fetch e.basicByEnum",
EntityOfMaps.class
).getSingleResult();
assert Hibernate.isInitialized( entity.getBasicByEnum() );
@ -90,9 +87,9 @@ public class MapOperationTests {
public void testDelete(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingMaps entity = session.createQuery(
"select e from EntityContainingMaps e join fetch e.basicByEnum",
EntityContainingMaps.class
final EntityOfMaps entity = session.createQuery(
"select e from EntityOfMaps e join fetch e.basicByEnum",
EntityOfMaps.class
).getSingleResult();
session.delete( entity );

View File

@ -11,6 +11,10 @@ import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.spi.DomainMetamodel;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.domain.gambit.EntityOfSets;
import org.hibernate.testing.orm.domain.gambit.EntityOfMaps;
import org.hibernate.testing.orm.domain.gambit.EntityOfLists;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
@ -24,15 +28,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author Steve Ebersole
*/
@DomainModel(
annotatedClasses = {
SimpleEntity.class,
EntityContainingLists.class,
EntityContainingSets.class,
EntityContainingMaps.class,
SomeStuff.class
}
)
@DomainModel( standardModels = StandardDomainModel.GAMBIT )
@ServiceRegistry
@SessionFactory
@SuppressWarnings("WeakerAccess")
@ -41,58 +37,65 @@ public class PluralAttributeMappingTests {
@Test
public void testLists(SessionFactoryScope scope) {
final DomainMetamodel domainModel = scope.getSessionFactory().getDomainModel();
final EntityMappingType containerEntityDescriptor = domainModel.getEntityDescriptor( EntityContainingLists.class );
final EntityMappingType containerEntityDescriptor = domainModel.getEntityDescriptor( EntityOfLists.class );
assertThat( containerEntityDescriptor.getNumberOfAttributeMappings(), is( 6 ) );
assertThat( containerEntityDescriptor.getNumberOfAttributeMappings(), is( 7 ) );
final AttributeMapping listOfBasics = containerEntityDescriptor.findAttributeMapping( "listOfBasics" );
assertThat( listOfBasics, notNullValue() );
final AttributeMapping listOfConvertedBasics = containerEntityDescriptor.findAttributeMapping( "listOfConvertedBasics" );
assertThat( listOfConvertedBasics, notNullValue() );
final AttributeMapping listOfEnums = containerEntityDescriptor.findAttributeMapping( "listOfEnums" );
assertThat( listOfEnums, notNullValue() );
final AttributeMapping listOfConvertedBasics = containerEntityDescriptor.findAttributeMapping( "listOfConvertedEnums" );
assertThat( listOfConvertedBasics, notNullValue() );
final AttributeMapping listOfComponents = containerEntityDescriptor.findAttributeMapping( "listOfComponents" );
assertThat( listOfComponents, notNullValue() );
final AttributeMapping listOfEntities = containerEntityDescriptor.findAttributeMapping( "listOfEntities" );
assertThat( listOfEntities, notNullValue() );
final AttributeMapping listOfOneToMany = containerEntityDescriptor.findAttributeMapping( "listOfOneToMany" );
assertThat( listOfOneToMany, notNullValue() );
final AttributeMapping listOfManyToMany = containerEntityDescriptor.findAttributeMapping( "listOfManyToMany" );
assertThat( listOfManyToMany, notNullValue() );
}
@Test
public void testSets(SessionFactoryScope scope) {
final DomainMetamodel domainModel = scope.getSessionFactory().getDomainModel();
final EntityMappingType containerEntityDescriptor = domainModel.getEntityDescriptor( EntityContainingSets.class );
final EntityMappingType containerEntityDescriptor = domainModel.getEntityDescriptor( EntityOfSets.class );
assertThat( containerEntityDescriptor.getNumberOfAttributeMappings(), is( 7 ) );
assertThat( containerEntityDescriptor.getNumberOfAttributeMappings(), is( 9 ) );
final AttributeMapping setOfBasics = containerEntityDescriptor.findAttributeMapping( "setOfBasics" );
assertThat( setOfBasics, notNullValue() );
final AttributeMapping setOfConvertedBasics = containerEntityDescriptor.findAttributeMapping( "setOfConvertedBasics" );
assertThat( setOfConvertedBasics, notNullValue() );
final AttributeMapping sortedSetOfBasics = containerEntityDescriptor.findAttributeMapping( "sortedSetOfBasics" );
assertThat( sortedSetOfBasics, notNullValue() );
final AttributeMapping setOfEnums = containerEntityDescriptor.findAttributeMapping( "setOfEnums" );
assertThat( setOfEnums, notNullValue() );
final AttributeMapping setOfConvertedBasics = containerEntityDescriptor.findAttributeMapping( "setOfConvertedEnums" );
assertThat( setOfConvertedBasics, notNullValue() );
final AttributeMapping setOfComponents = containerEntityDescriptor.findAttributeMapping( "setOfComponents" );
assertThat( setOfComponents, notNullValue() );
final AttributeMapping setOfEntities = containerEntityDescriptor.findAttributeMapping( "setOfEntities" );
assertThat( setOfEntities, notNullValue() );
final AttributeMapping extraLazySetOfComponents = containerEntityDescriptor.findAttributeMapping( "extraLazySetOfComponents" );
assertThat( extraLazySetOfComponents, notNullValue() );
final AttributeMapping sortedSetOfBasics = containerEntityDescriptor.findAttributeMapping( "sortedSetOfBasics" );
assertThat( sortedSetOfBasics, notNullValue() );
final AttributeMapping setOfOneToMany = containerEntityDescriptor.findAttributeMapping( "setOfOneToMany" );
assertThat( setOfOneToMany, notNullValue() );
final AttributeMapping setOfManyToMany = containerEntityDescriptor.findAttributeMapping( "setOfManyToMany" );
assertThat( setOfManyToMany, notNullValue() );
}
@Test
public void testMaps(SessionFactoryScope scope) {
final DomainMetamodel domainModel = scope.getSessionFactory().getDomainModel();
final EntityMappingType containerEntityDescriptor = domainModel.getEntityDescriptor( EntityContainingMaps.class );
final EntityMappingType containerEntityDescriptor = domainModel.getEntityDescriptor( EntityOfMaps.class );
// 8 for now, until entity-valued map keys is supported
assertThat( containerEntityDescriptor.getNumberOfAttributeMappings(), is( 9 ) );
@ -112,12 +115,12 @@ public class PluralAttributeMappingTests {
assertThat( basicByConvertedEnum.getKeyDescriptor(), notNullValue() );
assertThat( basicByConvertedEnum.getElementDescriptor(), notNullValue() );
final PluralAttributeMapping someStuffByBasic = (PluralAttributeMapping) containerEntityDescriptor.findAttributeMapping( "someStuffByBasic" );
final PluralAttributeMapping someStuffByBasic = (PluralAttributeMapping) containerEntityDescriptor.findAttributeMapping( "componentByBasic" );
assertThat( someStuffByBasic, notNullValue() );
assertThat( someStuffByBasic.getKeyDescriptor(), notNullValue() );
assertThat( someStuffByBasic.getElementDescriptor(), notNullValue() );
final PluralAttributeMapping basicBySomeStuff = (PluralAttributeMapping) containerEntityDescriptor.findAttributeMapping( "basicBySomeStuff" );
final PluralAttributeMapping basicBySomeStuff = (PluralAttributeMapping) containerEntityDescriptor.findAttributeMapping( "basicByComponent" );
assertThat( basicBySomeStuff, notNullValue() );
assertThat( basicBySomeStuff.getKeyDescriptor(), notNullValue() );
assertThat( basicBySomeStuff.getElementDescriptor(), notNullValue() );

View File

@ -10,9 +10,14 @@ import java.util.Iterator;
import org.hibernate.Hibernate;
import org.hibernate.testing.hamcrest.CollectionMatchers;
import org.hibernate.testing.hamcrest.InitializationCheckMatcher;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.domain.gambit.EntityOfSets;
import org.hibernate.testing.orm.domain.gambit.EnumValue;
import org.hibernate.testing.orm.domain.gambit.SimpleComponent;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.DomainModelScope;
import org.hibernate.testing.orm.junit.FailureExpected;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@ -20,21 +25,15 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author Steve Ebersole
*/
@SuppressWarnings("WeakerAccess")
@DomainModel(
annotatedClasses = {
SimpleEntity.class,
EntityContainingSets.class,
SomeStuff.class
}
)
@DomainModel( standardModels = StandardDomainModel.GAMBIT )
@ServiceRegistry
@SessionFactory
public class SetOperationTests {
@ -42,7 +41,7 @@ public class SetOperationTests {
public void createData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = new EntityContainingSets( 1, "first-map-entity" );
final EntityOfSets entity = new EntityOfSets( 1, "first-map-entity" );
entity.addBasic( "a value" );
entity.addBasic( "another value" );
@ -52,11 +51,11 @@ public class SetOperationTests {
entity.addEnum( EnumValue.ONE );
entity.addEnum( EnumValue.TWO );
entity.addConvertedBasic( EnumValue.ONE );
entity.addConvertedBasic( EnumValue.THREE );
entity.addConvertedEnum( EnumValue.ONE );
entity.addConvertedEnum( EnumValue.THREE );
entity.addComponent( new SomeStuff( "the stuff - 1", "the stuff - 2" ) );
entity.addComponent( new SomeStuff( "other stuff - 1", "other stuff - 2" ) );
entity.addComponent( new SimpleComponent( "the stuff - 1", "the stuff - 2" ) );
entity.addComponent( new SimpleComponent( "other stuff - 1", "other stuff - 2" ) );
session.save( entity );
}
@ -64,11 +63,10 @@ public class SetOperationTests {
}
@AfterEach
public void dropData(SessionFactoryScope scope, DomainModelScope domainModelScope) {
public void dropData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.load( EntityContainingSets.class, 1 );
session.delete( entity );
session.createQuery( "delete from EntityOfSets where name is not null" ).executeUpdate();
}
);
}
@ -77,9 +75,9 @@ public class SetOperationTests {
public void testLoad(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.load( EntityContainingSets.class, 1 );
final EntityOfSets entity = session.load( EntityOfSets.class, 1 );
assertThat( entity, is( notNullValue() ) );
assertThat( Hibernate.isInitialized( entity ), is( false ) );
assertThat( entity, InitializationCheckMatcher.isNotInitialized() );
}
);
}
@ -88,10 +86,24 @@ public class SetOperationTests {
public void testGet(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.get( EntityContainingSets.class, 1 );
final EntityOfSets entity = session.get( EntityOfSets.class, 1 );
assertThat( entity, is( notNullValue() ) );
assertThat( Hibernate.isInitialized( entity ), is( true ) );
assertThat( Hibernate.isInitialized( entity.getSetOfBasics() ), is( false ) );
assertThat( entity, InitializationCheckMatcher.isInitialized() );
assertThat( entity.getSetOfBasics(), InitializationCheckMatcher.isNotInitialized() );
}
);
}
@Test
public void testSqm(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityOfSets entity = session.createQuery(
"select e from EntityOfSets e",
EntityOfSets.class
).getSingleResult();
assertThat( entity.getSetOfBasics(), InitializationCheckMatcher.isNotInitialized() );
}
);
}
@ -100,12 +112,12 @@ public class SetOperationTests {
public void testSqmFetch(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.createQuery(
"select e from EntityContainingSets e join fetch e.setOfBasics",
EntityContainingSets.class
final EntityOfSets entity = session.createQuery(
"select e from EntityOfSets e join fetch e.setOfBasics",
EntityOfSets.class
).getSingleResult();
assert Hibernate.isInitialized( entity.getSetOfBasics() );
assertThat( entity.getSetOfBasics(), InitializationCheckMatcher.isInitialized() );
assert entity.getSetOfBasics().size() == 2;
}
@ -116,7 +128,7 @@ public class SetOperationTests {
public void testDeleteWithElementCollectionData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.load( EntityContainingSets.class, 1 );
final EntityOfSets entity = session.load( EntityOfSets.class, 1 );
session.delete( entity );
}
);
@ -129,14 +141,14 @@ public class SetOperationTests {
public void testTriggerFetch(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.get( EntityContainingSets.class, 1 );
assert ! Hibernate.isInitialized( entity.getSetOfBasics() );
final EntityOfSets entity = session.get( EntityOfSets.class, 1 );
assertThat( entity.getSetOfBasics(), InitializationCheckMatcher.isNotInitialized() );
// trigger the init
assertThat( entity.getSetOfBasics().size(), is( 2 ) );
assert Hibernate.isInitialized( entity.getSetOfBasics() );
assert ! Hibernate.isInitialized( entity.getSetOfEnums() );
assertThat( entity.getSetOfBasics(), InitializationCheckMatcher.isInitialized() );
assertThat( entity.getSetOfEnums(), InitializationCheckMatcher.isNotInitialized() );
}
);
}
@ -145,12 +157,14 @@ public class SetOperationTests {
public void testSortedSetAccess(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final EntityContainingSets entity = session.get( EntityContainingSets.class, 1 );
assert ! Hibernate.isInitialized( entity.getSortedSetOfBasics() );
final EntityOfSets entity = session.get( EntityOfSets.class, 1 );
assertThat( entity.getSortedSetOfBasics(), InitializationCheckMatcher.isNotInitialized() );
// trigger the init
Hibernate.initialize( entity.getSortedSetOfBasics() );
assertThat( entity.getSortedSetOfBasics(), InitializationCheckMatcher.isInitialized() );
assertThat( entity.getSortedSetOfBasics().size(), is( 2 ) );
assertThat( entity.getSetOfEnums(), InitializationCheckMatcher.isNotInitialized() );
final Iterator<String> iterator = entity.getSortedSetOfBasics().iterator();
final String first = iterator.next();

View File

@ -1,46 +0,0 @@
/*
* 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.orm.test.metamodel.mapping.collections;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author Steve Ebersole
*/
@Entity(name = "SimpleEntity")
@Table(name = "simple_entity")
public class SimpleEntity {
private Integer id;
private String name;
public SimpleEntity() {
}
public SimpleEntity(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -1,95 +0,0 @@
/*
* 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.orm.test.metamodel.mapping.collections;
import java.util.EnumSet;
import java.util.Map;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.tool.schema.SourceType;
import org.hibernate.tool.schema.TargetType;
import org.hibernate.tool.schema.spi.CommandAcceptanceException;
import org.hibernate.tool.schema.spi.ExceptionHandler;
import org.hibernate.tool.schema.spi.ExecutionOptions;
import org.hibernate.tool.schema.spi.SchemaManagementTool;
import org.hibernate.tool.schema.spi.ScriptSourceInput;
import org.hibernate.tool.schema.spi.ScriptTargetOutput;
import org.hibernate.tool.schema.spi.SourceDescriptor;
import org.hibernate.tool.schema.spi.TargetDescriptor;
import org.hibernate.testing.orm.junit.DomainModelScope;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
/**
* @author Steve Ebersole
*/
public class TempDropDataHelper {
static void cleanDatabaseSchema(SessionFactoryScope scope, DomainModelScope domainModelScope) {
final ServiceRegistryImplementor serviceRegistry = scope.getSessionFactory().getServiceRegistry();
final SchemaManagementTool schemaTool = serviceRegistry.getService( SchemaManagementTool.class );
final ExecutionOptions executionOptions = new ExecutionOptions() {
@Override
public Map getConfigurationValues() {
return scope.getSessionFactory().getProperties();
}
@Override
public boolean shouldManageNamespaces() {
return false;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new ExceptionHandler() {
@Override
public void handleException(CommandAcceptanceException exception) {
throw exception;
}
};
}
};
final SourceDescriptor sourceDescriptor = new SourceDescriptor() {
@Override
public SourceType getSourceType() {
return SourceType.METADATA;
}
@Override
public ScriptSourceInput getScriptSourceInput() {
return null;
}
};
final TargetDescriptor targetDescriptor = new TargetDescriptor() {
@Override
public EnumSet<TargetType> getTargetTypes() {
return EnumSet.of( TargetType.DATABASE );
}
@Override
public ScriptTargetOutput getScriptTargetOutput() {
return null;
}
};
schemaTool.getSchemaDropper( scope.getSessionFactory().getProperties() ).doDrop(
domainModelScope.getDomainModel(),
executionOptions,
sourceDescriptor,
targetDescriptor
);
schemaTool.getSchemaCreator( scope.getSessionFactory().getProperties() ).doCreation(
domainModelScope.getDomainModel(),
executionOptions,
sourceDescriptor,
targetDescriptor
);
}
}

View File

@ -32,6 +32,7 @@ import org.hibernate.testing.orm.domain.gambit.EntityOfBasics;
import org.hibernate.testing.orm.domain.gambit.EntityOfLists;
import org.hibernate.testing.orm.domain.gambit.EntityOfMaps;
import org.hibernate.testing.orm.domain.gambit.EntityOfSets;
import org.hibernate.testing.orm.domain.gambit.SimpleEntity;
import org.hibernate.testing.orm.junit.TestingUtil;
import org.junit.jupiter.api.Test;
@ -150,13 +151,13 @@ public class SelectClauseTests extends BaseSqmUnitTest {
@Test
public void testMapKeyFunction() {
collectionIndexFunctionAssertions(
interpretSelect( "select key(m) from EntityOfMaps e join e.basicToBasicMap m" ),
interpretSelect( "select key(m) from EntityOfMaps e join e.basicByBasic m" ),
CollectionClassification.MAP,
BasicDomainType.class,
"m"
);
collectionIndexFunctionAssertions(
interpretSelect( "select key(m) from EntityOfMaps e join e.componentToBasicMap m" ),
interpretSelect( "select key(m) from EntityOfMaps e join e.basicByComponent m" ),
CollectionClassification.MAP,
EmbeddableDomainType.class,
"m"
@ -194,18 +195,18 @@ public class SelectClauseTests extends BaseSqmUnitTest {
@Test
public void testMapValueFunction() {
collectionValueFunctionAssertions(
interpretSelect( "select value(m) from EntityOfMaps e join e.basicToBasicMap m" ),
EntityOfMaps.class.getName() + ".basicToBasicMap",
interpretSelect( "select value(m) from EntityOfMaps e join e.basicByBasic m" ),
EntityOfMaps.class.getName() + ".basicByBasic",
"m"
);
collectionValueFunctionAssertions(
interpretSelect( "select value(m) from EntityOfMaps e join e.basicToComponentMap m" ),
EntityOfMaps.class.getName() + ".basicToComponentMap",
interpretSelect( "select value(m) from EntityOfMaps e join e.componentByBasic m" ),
EntityOfMaps.class.getName() + ".componentByBasic",
"m"
);
collectionValueFunctionAssertions(
interpretSelect( "select value(m) from EntityOfMaps e join e.basicToOneToMany m" ),
EntityOfMaps.class.getName() + ".basicToOneToMany",
interpretSelect( "select value(m) from EntityOfMaps e join e.oneToManyByBasic m" ),
EntityOfMaps.class.getName() + ".oneToManyByBasic",
"m"
);
@ -284,7 +285,7 @@ public class SelectClauseTests extends BaseSqmUnitTest {
@Test
public void testMapEntryFunction() {
SqmSelectStatement statement = interpretSelect( "select entry(m) from EntityOfMaps e join e.basicToManyToMany m" );
SqmSelectStatement statement = interpretSelect( "select entry(m) from EntityOfMaps e join e.manyToManyByBasic m" );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
@ -321,6 +322,7 @@ public class SelectClauseTests extends BaseSqmUnitTest {
EntityOfLists.class,
EntityOfMaps.class,
EntityOfSets.class,
SimpleEntity.class,
};
}

View File

@ -20,6 +20,7 @@ import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
import org.hibernate.testing.orm.domain.gambit.EntityOfLists;
import org.hibernate.testing.orm.domain.gambit.EntityOfMaps;
import org.hibernate.testing.orm.domain.gambit.EntityOfSets;
import org.hibernate.testing.orm.domain.gambit.SimpleEntity;
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.instanceOf;
@ -42,6 +43,7 @@ public class WhereClauseTests extends BaseSqmUnitTest {
EntityOfLists.class,
EntityOfSets.class,
EntityOfMaps.class,
SimpleEntity.class,
};
}

View File

@ -0,0 +1,38 @@
/*
* 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.orm.test.query.sqm.mutation.multitable;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
/**
* @author Steve Ebersole
*/
@SuppressWarnings("WeakerAccess")
@DomainModel( standardModels = StandardDomainModel.GAMBIT )
@ServiceRegistry
@SessionFactory( exportSchema = true )
public class BasicDeletionTests {
@BeforeEach
public void createTestData(SessionFactoryScope scope) {
}
@AfterEach
public void dropTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
session.createQuery( "delete from " ).executeUpdate();
}
);
}
}

View File

@ -1,194 +0,0 @@
/*
* 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.orm.test.sql.exec;
import java.sql.Statement;
import org.hibernate.Hibernate;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.orm.test.metamodel.mapping.collections.SomeStuff;
import org.hibernate.orm.test.metamodel.mapping.collections.EntityContainingLists;
import org.hibernate.orm.test.metamodel.mapping.collections.EntityContainingSets;
import org.hibernate.orm.test.metamodel.mapping.collections.EnumValue;
import org.hibernate.orm.test.metamodel.mapping.collections.SimpleEntity;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author Steve Ebersole
*/
@DomainModel(
annotatedClasses = {
SimpleEntity.class,
EntityContainingLists.class,
EntityContainingSets.class,
SomeStuff.class
}
)
@ServiceRegistry
@SessionFactory
@SuppressWarnings("WeakerAccess")
public class PluralAttributeSmokeTests {
@Test
public void listBaselineTest(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final QueryImplementor<EntityContainingLists> query = session.createQuery(
"select e from EntityContainingLists e",
EntityContainingLists.class
);
final EntityContainingLists result = query.uniqueResult();
assertThat( result, notNullValue() );
assertThat( result.getListOfBasics(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfBasics() ), is( false ) );
}
);
}
@Test
public void listEagerBasicTest(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final QueryImplementor<EntityContainingLists> query = session.createQuery(
"select e from EntityContainingLists e join fetch e.listOfBasics",
EntityContainingLists.class
);
final EntityContainingLists result = query.uniqueResult();
assertThat( result, notNullValue() );
assertThat( result.getListOfBasics(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfBasics() ), is( true ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfBasics() ) );
assertThat( result.getListOfBasics().size(), is( 3 ) );
assertThat( result.getListOfConvertedBasics(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfConvertedBasics() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfConvertedBasics() ) );
assertThat( result.getListOfEnums(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfEnums() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfEnums() ) );
assertThat( result.getListOfComponents(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfComponents() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfComponents() ) );
assertThat( result.getListOfEntities(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getListOfEntities() ), is( false ) );
assertTrue( session.getPersistenceContext().containsCollection( (PersistentCollection) result.getListOfEntities() ) );
}
);
}
@Test
public void setBaselineTest(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final QueryImplementor<EntityContainingSets> query = session.createQuery(
"select e from EntityContainingSets e",
EntityContainingSets.class
);
final EntityContainingSets result = query.uniqueResult();
assertThat( result, notNullValue() );
assertThat( result.getSetOfBasics(), notNullValue() );
assertThat( Hibernate.isInitialized( result.getSetOfBasics() ), is( false ) );
}
);
}
@BeforeAll
public void createTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
final SimpleEntity simpleEntity1 = new SimpleEntity( 1, "simple-1" );
final SimpleEntity simpleEntity2 = new SimpleEntity( 2, "simple-2" );
session.save( simpleEntity1 );
session.save( simpleEntity2 );
{
final EntityContainingLists entityContainingLists = new EntityContainingLists( 1, "first" );
entityContainingLists.addBasic( "abc" );
entityContainingLists.addBasic( "def" );
entityContainingLists.addBasic( "ghi" );
entityContainingLists.addConvertedBasic( EnumValue.TWO );
entityContainingLists.addEnum( EnumValue.ONE );
entityContainingLists.addEnum( EnumValue.THREE );
entityContainingLists.addComponent( new SomeStuff( "first-a1", "first-another-a1" ) );
entityContainingLists.addComponent( new SomeStuff( "first-a2", "first-another-a2" ) );
entityContainingLists.addSimpleEntity( simpleEntity1 );
entityContainingLists.addSimpleEntity( simpleEntity2 );
session.save( entityContainingLists );
}
{
final EntityContainingSets entity = new EntityContainingSets( 1, "first" );
entity.addBasic( "abc" );
entity.addBasic( "def" );
entity.addBasic( "ghi" );
entity.addConvertedBasic( EnumValue.TWO );
entity.addEnum( EnumValue.ONE );
entity.addEnum( EnumValue.THREE );
entity.addComponent( new SomeStuff( "first-a1", "first-another-a1" ) );
entity.addComponent( new SomeStuff( "first-a2", "first-another-a2" ) );
entity.addSimpleEntity( simpleEntity1 );
entity.addSimpleEntity( simpleEntity2 );
session.save( entity );
}
}
);
}
@AfterAll
public void deleteTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> session.doWork(
conn -> {
try ( Statement stmnt = conn.createStatement() ) {
stmnt.execute( "delete from EntityContainingLists_listOfEnums" );
stmnt.execute( "delete from EntityContainingLists_listOfConvertedBasics" );
stmnt.execute( "delete from EntityContainingLists_listOfComponents" );
stmnt.execute( "delete from EntityContainingLists_listOfBasics" );
stmnt.execute( "delete from entity_containing_lists_simple_entity" );
stmnt.execute( "delete from entity_containing_lists" );
}
}
)
);
}
}

View File

@ -28,4 +28,22 @@ public class CollectionMatchers {
public static Matcher<Collection<?>> hasSize(int size) {
return org.hamcrest.Matchers.hasSize( size );
}
public static <X extends Collection<?>> HasNullElementsMatcher<X> hasNullElements() {
//noinspection unchecked
return HasNullElementsMatcher.HAS_NULL_ELEMENTS_MATCHER;
}
public static <X extends Collection<?>> HasNullElementsMatcher<X> hasNoNullElements() {
//noinspection unchecked
return HasNullElementsMatcher.HAS_NO_NULL_ELEMENTS_MATCHER;
}
public static <C extends Collection<?>> Matcher<C> isInitialized() {
return InitializationCheckMatcher.isInitialized();
}
public static <C extends Collection<?>> Matcher<C> isNotInitialized() {
return InitializationCheckMatcher.isNotInitialized();
}
}

View File

@ -0,0 +1,58 @@
/*
* 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.testing.hamcrest;
import java.util.Collection;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author Steve Ebersole
*/
public class HasNullElementsMatcher<C extends Collection<?>> extends BaseMatcher<C> {
public static final HasNullElementsMatcher HAS_NULL_ELEMENTS_MATCHER = new HasNullElementsMatcher( false );
public static final HasNullElementsMatcher HAS_NO_NULL_ELEMENTS_MATCHER = new HasNullElementsMatcher( true );
private final boolean negated;
public HasNullElementsMatcher(boolean negated) {
this.negated = negated;
}
@Override
public boolean matches(Object item) {
assertThat( item, instanceOf( Collection.class ) );
//noinspection unchecked
C collection = (C) item;
if ( negated ) {
// check no-null-elements - if any is null, this check fails
collection.forEach( e -> assertThat( e, notNullValue() ) );
return true;
}
boolean foundOne = false;
for ( Object e : collection ) {
if ( e == null ) {
foundOne = true;
break;
}
}
return foundOne;
}
@Override
public void describeTo(Description description) {
description.appendText( "had null elements" );
}
}

View File

@ -0,0 +1,53 @@
/*
* 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.testing.hamcrest;
import org.hibernate.Hibernate;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
/**
* @author Steve Ebersole
*/
@SuppressWarnings("WeakerAccess")
public class InitializationCheckMatcher<T> extends BaseMatcher<T> {
public static final InitializationCheckMatcher INITIALIZED_MATCHER = new InitializationCheckMatcher();
public static final InitializationCheckMatcher UNINITIALIZED_MATCHER = new InitializationCheckMatcher( false );
public static <T> InitializationCheckMatcher<T> isInitialized() {
//noinspection unchecked
return INITIALIZED_MATCHER;
}
public static <T> Matcher<T> isNotInitialized() {
//noinspection unchecked
return UNINITIALIZED_MATCHER;
}
private final boolean assertInitialized;
public InitializationCheckMatcher() {
this( true );
}
public InitializationCheckMatcher(boolean assertInitialized) {
this.assertInitialized = assertInitialized;
}
@Override
public boolean matches(Object item) {
final boolean initialized = Hibernate.isInitialized( item );
return assertInitialized ? initialized : !initialized;
}
@Override
public void describeTo(Description description) {
description.appendValue( "Hibernate#isInitialized == " + !assertInitialized );
}
}

View File

@ -6,9 +6,13 @@
*/
package org.hibernate.testing.orm.domain.gambit;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Convert;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
@ -21,10 +25,25 @@ import javax.persistence.OrderColumn;
@Entity
public class EntityOfLists {
private Integer id;
private String name;
private List<String> listOfBasics;
private List<Component> listOfComponents;
private List<EntityOfLists> listOfOneToMany;
private List<EntityOfLists> listOfManyToMany;
private List<EnumValue> listOfConvertedEnums;
private List<EnumValue> listOfEnums;
private List<SimpleComponent> listOfComponents;
private List<SimpleEntity> listOfOneToMany;
private List<SimpleEntity> listOfManyToMany;
public EntityOfLists() {
}
public EntityOfLists(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
public Integer getId() {
@ -35,6 +54,18 @@ public class EntityOfLists {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// listOfBasics
@ElementCollection
@OrderColumn
public List<String> getListOfBasics() {
@ -45,33 +76,117 @@ public class EntityOfLists {
this.listOfBasics = listOfBasics;
}
public void addBasic(String basic) {
if ( listOfBasics == null ) {
listOfBasics = new ArrayList<>();
}
listOfBasics.add( basic );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// listOfConvertedEnums
@ElementCollection
@OrderColumn
public List<Component> getListOfComponents() {
@Convert(converter = EnumValueConverter.class)
public List<EnumValue> getListOfConvertedEnums() {
return listOfConvertedEnums;
}
public void setListOfConvertedEnums(List<EnumValue> listOfConvertedEnums) {
this.listOfConvertedEnums = listOfConvertedEnums;
}
public void addConvertedEnum(EnumValue value) {
if ( listOfConvertedEnums == null ) {
listOfConvertedEnums = new ArrayList<>();
}
listOfConvertedEnums.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// listOfEnums
@ElementCollection
@Enumerated(EnumType.STRING)
@OrderColumn
public List<EnumValue> getListOfEnums() {
return listOfEnums;
}
public void setListOfEnums(List<EnumValue> listOfEnums) {
this.listOfEnums = listOfEnums;
}
public void addEnum(EnumValue value) {
if ( listOfEnums == null ) {
listOfEnums = new ArrayList<>();
}
listOfEnums.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// listOfComponents
@ElementCollection
@OrderColumn
public List<SimpleComponent> getListOfComponents() {
return listOfComponents;
}
public void setListOfComponents(List<Component> listOfComponents) {
public void setListOfComponents(List<SimpleComponent> listOfComponents) {
this.listOfComponents = listOfComponents;
}
public void addComponent(SimpleComponent value) {
if ( listOfComponents == null ) {
listOfComponents = new ArrayList<>();
}
listOfComponents.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// listOfOneToMany
@OneToMany
@OrderColumn
public List<EntityOfLists> getListOfOneToMany() {
public List<SimpleEntity> getListOfOneToMany() {
return listOfOneToMany;
}
public void setListOfOneToMany(List<EntityOfLists> listOfOneToMany) {
public void setListOfOneToMany(List<SimpleEntity> listOfOneToMany) {
this.listOfOneToMany = listOfOneToMany;
}
public void addOneToMany(SimpleEntity value) {
if ( listOfOneToMany == null ) {
listOfOneToMany = new ArrayList<>();
}
listOfOneToMany.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// listOfManyToMany
@ManyToMany
@OrderColumn
public List<EntityOfLists> getListOfManyToMany() {
public List<SimpleEntity> getListOfManyToMany() {
return listOfManyToMany;
}
public void setListOfManyToMany(List<EntityOfLists> listOfManyToMany) {
public void setListOfManyToMany(List<SimpleEntity> listOfManyToMany) {
this.listOfManyToMany = listOfManyToMany;
}
public void addManyToMany(SimpleEntity value) {
if ( listOfManyToMany == null ) {
listOfManyToMany = new ArrayList<>();
}
listOfManyToMany.add( value );
}
}

View File

@ -6,12 +6,15 @@
*/
package org.hibernate.testing.orm.domain.gambit;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Convert;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.MapKeyEnumerated;
import javax.persistence.OneToMany;
/**
@ -21,11 +24,26 @@ import javax.persistence.OneToMany;
@Entity
public class EntityOfMaps {
private Integer id;
private Map<String,String> basicToBasicMap;
private Map<String, Component> basicToComponentMap;
private Map<Component,String> componentToBasicMap;
private Map<String, EntityOfMaps> basicToOneToMany;
private Map<String, EntityOfMaps> basicToManyToMany;
private String name;
private Map<String,String> basicByBasic;
private Map<EnumValue,String> basicByEnum;
private Map<EnumValue,String> basicByConvertedEnum;
private Map<String, SimpleComponent> componentByBasic;
private Map<SimpleComponent,String> basicByComponent;
private Map<String, SimpleEntity> oneToManyByBasic;
private Map<SimpleEntity,String> basicByOneToMany;
private Map<String, SimpleEntity> manyToManyByBasic;
public EntityOfMaps() {
}
public EntityOfMaps(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
public Integer getId() {
@ -36,50 +54,175 @@ public class EntityOfMaps {
this.id = id;
}
@ElementCollection
public Map<String, String> getBasicToBasicMap() {
return basicToBasicMap;
public String getName() {
return name;
}
public void setBasicToBasicMap(Map<String, String> basicToBasicMap) {
this.basicToBasicMap = basicToBasicMap;
public void setName(String name) {
this.name = name;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// basicByBasic
@ElementCollection
public Map<String, Component> getBasicToComponentMap() {
return basicToComponentMap;
public Map<String, String> getBasicByBasic() {
return basicByBasic;
}
public void setBasicToComponentMap(Map<String, Component> basicToComponentMap) {
this.basicToComponentMap = basicToComponentMap;
public void setBasicByBasic(Map<String, String> basicByBasic) {
this.basicByBasic = basicByBasic;
}
public void addBasicByBasic(String key, String val) {
if ( basicByBasic == null ) {
basicByBasic = new HashMap<>();
}
basicByBasic.put( key, val );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// basicByEnum
@ElementCollection
public Map<Component, String> getComponentToBasicMap() {
return componentToBasicMap;
@MapKeyEnumerated
public Map<EnumValue, String> getBasicByEnum() {
return basicByEnum;
}
public void setComponentToBasicMap(Map<Component, String> componentToBasicMap) {
this.componentToBasicMap = componentToBasicMap;
public void setBasicByEnum(Map<EnumValue, String> basicByEnum) {
this.basicByEnum = basicByEnum;
}
public void addBasicByEnum(EnumValue key, String val) {
if ( basicByEnum == null ) {
basicByEnum = new HashMap<>();
}
basicByEnum.put( key, val );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// basicByConvertedEnum
@ElementCollection
@Convert(attributeName = "key", converter = EnumValueConverter.class)
public Map<EnumValue, String> getBasicByConvertedEnum() {
return basicByConvertedEnum;
}
public void setBasicByConvertedEnum(Map<EnumValue, String> basicByConvertedEnum) {
this.basicByConvertedEnum = basicByConvertedEnum;
}
public void addBasicByConvertedEnum(EnumValue key, String value) {
if ( basicByConvertedEnum == null ) {
basicByConvertedEnum = new HashMap<>();
}
basicByConvertedEnum.put( key, value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// componentByBasic
@ElementCollection
public Map<String, SimpleComponent> getComponentByBasic() {
return componentByBasic;
}
public void setComponentByBasic(Map<String, SimpleComponent> componentByBasic) {
this.componentByBasic = componentByBasic;
}
public void addComponentByBasic(String key, SimpleComponent value) {
if ( componentByBasic == null ) {
componentByBasic = new HashMap<>();
}
componentByBasic.put( key, value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// basicByComponent
@ElementCollection
public Map<SimpleComponent, String> getBasicByComponent() {
return basicByComponent;
}
public void setBasicByComponent(Map<SimpleComponent, String> basicByComponent) {
this.basicByComponent = basicByComponent;
}
public void addBasicByComponent(SimpleComponent key, String value) {
if ( basicByComponent == null ) {
basicByComponent = new HashMap<>();
}
basicByComponent.put( key, value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// oneToManyByBasic
@OneToMany
@JoinColumn
public Map<String, EntityOfMaps> getBasicToOneToMany() {
return basicToOneToMany;
public Map<String, SimpleEntity> getOneToManyByBasic() {
return oneToManyByBasic;
}
public void setBasicToOneToMany(Map<String, EntityOfMaps> basicToOneToMany) {
this.basicToOneToMany = basicToOneToMany;
public void setOneToManyByBasic(Map<String, SimpleEntity> oneToManyByBasic) {
this.oneToManyByBasic = oneToManyByBasic;
}
public void addOneToManyByComponent(String key, SimpleEntity value) {
if ( oneToManyByBasic == null ) {
oneToManyByBasic = new HashMap<>();
}
oneToManyByBasic.put( key, value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// basicByOneToMany
@ElementCollection
public Map<SimpleEntity, String> getBasicByOneToMany() {
return basicByOneToMany;
}
public void setBasicByOneToMany(Map<SimpleEntity, String> basicByOneToMany) {
this.basicByOneToMany = basicByOneToMany;
}
public void addOneToManyByBasic(SimpleEntity key, String val) {
if ( basicByOneToMany == null ) {
basicByOneToMany = new HashMap<>();
}
basicByOneToMany.put( key, val );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// manyToManyByBasic
@ManyToMany
public Map<String, EntityOfMaps> getBasicToManyToMany() {
return basicToManyToMany;
public Map<String, SimpleEntity> getManyToManyByBasic() {
return manyToManyByBasic;
}
public void setBasicToManyToMany(Map<String, EntityOfMaps> basicToManyToMany) {
this.basicToManyToMany = basicToManyToMany;
public void setManyToManyByBasic(Map<String, SimpleEntity> manyToManyByBasic) {
this.manyToManyByBasic = manyToManyByBasic;
}
public void addManyToManyByComponent(String key, SimpleEntity value) {
if ( manyToManyByBasic == null ) {
manyToManyByBasic = new HashMap<>();
}
manyToManyByBasic.put( key, value );
}
}

View File

@ -9,12 +9,17 @@ package org.hibernate.testing.orm.domain.gambit;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.persistence.CollectionTable;
import javax.persistence.Convert;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@ -25,25 +30,29 @@ import org.hibernate.annotations.SortNatural;
*/
@SuppressWarnings("unused")
@Entity
@Table(name = "entity_containing_sets")
public class EntityOfSets {
private Integer id;
private Set<String> setOfBasics;
private Set<Component> setOfComponents;
private Set<Component> setOfExtraLazyComponents;
private Set<EntityOfSets> setOfOneToMany;
private Set<EntityOfSets> setOfManyToMany;
private String name;
private Set<String> setOfBasics;
private SortedSet<String> sortedSetOfBasics;
private Set<EnumValue> setOfEnums;
private Set<EnumValue> setOfConvertedEnums;
private Set<SimpleComponent> setOfComponents;
private Set<SimpleComponent> extraLazySetOfComponents;
private Set<SimpleEntity> setOfOneToMany;
private Set<SimpleEntity> setOfManyToMany;
public EntityOfSets() {
}
public EntityOfSets(Integer id) {
public EntityOfSets(Integer id, String name) {
this.id = id;
this.setOfBasics = new HashSet<>();
this.setOfComponents = new HashSet<>();
this.setOfOneToMany = new HashSet<>();
this.setOfManyToMany = new HashSet<>();
this.name = name;
}
@Id
@ -55,8 +64,19 @@ public class EntityOfSets {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfBasics
@ElementCollection()
// @ElementCollection( fetch = FetchType.EAGER )
@CollectionTable( name = "EntityOfSet_basics")
public Set<String> getSetOfBasics() {
return setOfBasics;
@ -66,46 +86,16 @@ public class EntityOfSets {
this.setOfBasics = setOfBasics;
}
@ElementCollection
@CollectionTable( name = "EntityOfSet_components")
public Set<Component> getSetOfComponents() {
return setOfComponents;
public void addBasic(String value) {
if ( setOfBasics == null ) {
setOfBasics = new HashSet<>();
}
setOfBasics.add( value );
}
public void setSetOfComponents(Set<Component> setOfComponents) {
this.setOfComponents = setOfComponents;
}
@ElementCollection
@LazyCollection( LazyCollectionOption.EXTRA )
@CollectionTable( name = "EntityOfSet_extraLazyComponents")
public Set<Component> getSetOfExtraLazyComponents() {
return setOfExtraLazyComponents;
}
public void setSetOfExtraLazyComponents(Set<Component> setOfExtraLazyComponents) {
this.setOfExtraLazyComponents = setOfExtraLazyComponents;
}
@OneToMany
@CollectionTable( name = "EntityOfSet_oneToMany")
public Set<EntityOfSets> getSetOfOneToMany() {
return setOfOneToMany;
}
public void setSetOfOneToMany(Set<EntityOfSets> setOfOneToMany) {
this.setOfOneToMany = setOfOneToMany;
}
@ManyToMany
@CollectionTable( name = "EntityOfSet_manyToMany")
public Set<EntityOfSets> getSetOfManyToMany() {
return setOfManyToMany;
}
public void setSetOfManyToMany(Set<EntityOfSets> setOfManyToMany) {
this.setOfManyToMany = setOfManyToMany;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// sortedSetOfBasics
@ElementCollection()
@CollectionTable( name = "EntityOfSet_sortedBasics")
@ -117,4 +107,138 @@ public class EntityOfSets {
public void setSortedSetOfBasics(SortedSet<String> sortedSetOfBasics) {
this.sortedSetOfBasics = sortedSetOfBasics;
}
public void addSortedBasic(String value) {
if ( sortedSetOfBasics == null ) {
sortedSetOfBasics = new TreeSet<>();
}
sortedSetOfBasics.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfConvertedEnums
@ElementCollection
@Convert(converter = EnumValueConverter.class)
public Set<EnumValue> getSetOfConvertedEnums() {
return setOfConvertedEnums;
}
public void setSetOfConvertedEnums(Set<EnumValue> setOfConvertedEnums) {
this.setOfConvertedEnums = setOfConvertedEnums;
}
public void addConvertedEnum(EnumValue value) {
if ( setOfConvertedEnums == null ) {
setOfConvertedEnums = new HashSet<>();
}
setOfConvertedEnums.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfEnums
@ElementCollection
@Enumerated(EnumType.STRING)
public Set<EnumValue> getSetOfEnums() {
return setOfEnums;
}
public void setSetOfEnums(Set<EnumValue> setOfEnums) {
this.setOfEnums = setOfEnums;
}
public void addEnum(EnumValue value) {
if ( setOfEnums == null ) {
setOfEnums = new HashSet<>();
}
setOfEnums.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfComponents
@ElementCollection
@CollectionTable( name = "EntityOfSet_components")
public Set<SimpleComponent> getSetOfComponents() {
return setOfComponents;
}
public void setSetOfComponents(Set<SimpleComponent> setOfComponents) {
this.setOfComponents = setOfComponents;
}
public void addComponent(SimpleComponent value) {
if ( setOfComponents == null ) {
setOfComponents = new HashSet<>();
}
setOfComponents.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfExtraLazyComponents
@ElementCollection
@LazyCollection( LazyCollectionOption.EXTRA )
@CollectionTable( name = "EntityOfSet_extraLazyComponents")
public Set<SimpleComponent> getExtraLazySetOfComponents() {
return extraLazySetOfComponents;
}
public void setExtraLazySetOfComponents(Set<SimpleComponent> extraLazySetOfComponents) {
this.extraLazySetOfComponents = extraLazySetOfComponents;
}
public void addExtraLazyComponent(SimpleComponent value) {
if ( extraLazySetOfComponents == null ) {
extraLazySetOfComponents = new HashSet<>();
}
extraLazySetOfComponents.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfOneToMany
@OneToMany
@CollectionTable( name = "EntityOfSet_oneToMany")
public Set<SimpleEntity> getSetOfOneToMany() {
return setOfOneToMany;
}
public void setSetOfOneToMany(Set<SimpleEntity> setOfOneToMany) {
this.setOfOneToMany = setOfOneToMany;
}
public void addOneToMany(SimpleEntity value) {
if ( setOfOneToMany == null ) {
setOfOneToMany = new HashSet<>();
}
setOfOneToMany.add( value );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// setOfManyToMany
@ManyToMany
@CollectionTable( name = "EntityOfSet_manyToMany")
public Set<SimpleEntity> getSetOfManyToMany() {
return setOfManyToMany;
}
public void setSetOfManyToMany(Set<SimpleEntity> setOfManyToMany) {
this.setOfManyToMany = setOfManyToMany;
}
public void addManyToMany(SimpleEntity value) {
if ( setOfManyToMany == null ) {
setOfManyToMany = new HashSet<>();
}
setOfManyToMany.add( value );
}
}

View File

@ -4,7 +4,7 @@
* 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.orm.test.metamodel.mapping.collections;
package org.hibernate.testing.orm.domain.gambit;
/**
* @author Steve Ebersole

View File

@ -4,7 +4,7 @@
* 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.orm.test.metamodel.mapping.collections;
package org.hibernate.testing.orm.domain.gambit;
import javax.persistence.AttributeConverter;

View File

@ -4,7 +4,7 @@
* 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.orm.test.metamodel.mapping.collections;
package org.hibernate.testing.orm.domain.gambit;
import javax.persistence.Embeddable;
@ -12,14 +12,14 @@ import javax.persistence.Embeddable;
* @author Steve Ebersole
*/
@Embeddable
public class SomeStuff {
public class SimpleComponent {
private String anAttribute;
private String anotherAttribute;
public SomeStuff() {
public SimpleComponent() {
}
public SomeStuff(String anAttribute, String anotherAttribute) {
public SimpleComponent(String anAttribute, String anotherAttribute) {
this.anAttribute = anAttribute;
this.anotherAttribute = anotherAttribute;
}

View File

@ -34,6 +34,13 @@ public class SimpleEntity {
public SimpleEntity() {
}
public SimpleEntity(
Integer id,
String someString) {
this.id = id;
this.someString = someString;
}
public SimpleEntity(
Integer id,
Date someDate,