Skip to content

Metamodel Integration Tasks

Brett Meyer edited this page May 29, 2014 · 40 revisions

This document is specifically about integrating the new metamodel into master branch of hibernate-orm repository.

Tests that are known to fail on current metamodel branch are listed here.

Integration JIRA issue: HHH-8897

Repository: https://github.com/hibernate/hibernate-orm (branch: master)

Commit before integration: 1a87adca088c7b55f05726d25c9d6847dd5bb4e4

In order to minimize the impact of diverging functionality in master/metamodel branches, I took the following approach:

  • create a branch of master (HHH-8897-replace-metamodel);
  • delete the existing org.hibernate.metamodel package (main and test);
  • org.hibernate.metamodel package (main and test) from the metamodel branch into into HHH-8897-replace-metamodel;
  • make minimal code changes to accommodate the new metamodel.

This allows new/diverging functionality from the metamodel branch (outside of org.hibernate.metamodel) to be merged by the person most knowledgeable about that new/diverging functionality.

I did merge some functionality from metamodel branch that was required by org.hibernate.metamodel for compiling. In these cases, I made a guess and in some cases only merged some of the code for particular JIRA issues. It would be good for someone more familiar with the code to ensure that I did the right thing and in those cases where only parts were merged, to finish merging.

Still need to merge the following from metamodel (not a complete list):

  • session and entity manager factory building
  • make CacheRegion a service
  • new tests added metamodel (not in master)

Misc. TODOs:

  • @Embeddable classes need to be added to tests using BaseCoreFunctionalTestCase.getAnnotatedClasses(). Is that expected???
  • check duplication between org/hibernate/engine/jdbc/connections/spi/JdbcConnectionAccess and org/hibernate/engine/jdbc/spi/JdbcConnectionAccess
  • check duplication between hibernate-core/src/main/java/org/hibernate/jpa/metamodel/internal/ and hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/metamodel
  • MultiTableBulkIdStrategy is not supported because Mappings is not implemented for new metamodel
  • Add support for new property generation.
  • Add SingularAttributebinding.isLob (needed by AbstractEntityPersister)
  • Add DerivedValue.getText( Dialect )
  • Remove Configuration and MetadataImplementor from collection persister args
  • Remove AbstractCollectionPersister.nodeName, elementNodeName, indexNodeName
  • Remove obsolete dialects (old postgresql and oracle dialects)
  • Remove obsolete TypeFactory methods and Type constructors
  • Get rid of CollectionType.getElementClass(); should be able to get it from domain. Problem is that ClassLoaderService cannot handle primitive classes. Should it? I've temporarily added a map of primitive class names -> Class to MetadataImpl to deal with primitive arrays.

The following test failures probably require functionality to be merged from metamodel branch:

BeanValidation is not working (Hardy?):

  • org.hibernate.test.annotations.beanvalidation.BeanValidationAutoTest
  • org.hibernate.test.annotations.beanvalidation.BeanValidationGroupsTest
  • org.hibernate.test.annotations.beanvalidation.BeanValidationProvidedFactoryTest
  • org.hibernate.test.annotations.beanvalidation.DDLTest
  • org.hibernate.test.annotations.beanvalidation.DDLWithoutCallbackTest
  • org.hibernate.test.annotations.beanvalidation.HibernateTraversableResolverTest
  • org.hibernate.test.c3p0.StatementCacheTest

Map key column is non-nullable; inserting null:

  • org.hibernate.test.hql.BulkManipulationTest.testManyToManyBulkDeleteMultiTable Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "RELATIONSHIP"; SQL statement: insert into Human_Human (human1, human2) values (?, ?) [90006-145]

Discriminators for joined subclasses has wrong type sometimes (related to addition of AvailableSettings.IMPLICIT_DISCRIMINATOR_COLUMNS_FOR_JOINED_SUBCLASS???) (Strong or Gail):

  • org.hibernate.test.joinedsubclass.JoinedSubclassWithImplicitDiscriminatorTest.metadataAssertions()
  • org.hibernate.test.joinedsubclass.JoinedSubclassWithExplicitDiscriminatorTest.metadataAssertions()
  • org.hibernate.test.collection.lazynocascade.LazyAssociationNoCascadeTest

Fewer entity loads than expected in concurrent transactions:

  • org.hibernate.test.tm.CMTTest.testConcurrent() java.lang.AssertionError: Expected :7 Actual :3

org.hibernate.test.cid.CompositeIdWithGeneratorTest fails in master because new metamodel cannot handle an IdentityGenerator w/ more than one column. (was changed to IdentifierGenerator on metamodel branch). org.hibernate.test.propertyref.basic.BasicPropertiesTest fails on master; not in metamodel branch.

New metamodel does not support a registered default tuplizer (IIRC, that should be added as a service):

  • org.hibernate.test.dynamicentity.tuplizer2.ImprovedTuplizerDynamicEntityTest

NamingStrategy is not working:

  • org.hibernate.test.namingstrategy.NamingStrategyTest.testDatabaseColumnNames
  • org.hibernate.test.namingstrategy.NamingStrategyTest.testDatabaseTableNames

Stored procedures not working (not exported?):

  • org.hibernate.test.sql.storedproc.StoredProcedureTest.testGetResultListTuple
  • org.hibernate.test.sql.storedproc.StoredProcedureTest.testGetSingleResultTuple
  • org.hibernate.test.sql.storedproc.StoredProcedureTest.testInParametersByName
  • org.hibernate.test.sql.storedproc.StoredProcedureTest.testInParametersByPosition

Generated values are broken (not inserted and are non-nullable):

  • org.hibernate.test.generated.DefaultGeneratedValueTest.testGeneration
  • org.hibernate.test.generated.DefaultGeneratedValueTest > testUpdateTimestampGeneration

EntityNotFoundException is not thrown when it should be:

  • org.hibernate.test.jpa.proxy.JPAProxyTest.testEjb3ProxyUsage
  • org.hibernate.test.jpa.proxy.JPAProxyTest.testGetSemantics

The number of primary key column sources provided for a secondary table is not equal to the number of columns in the primary key:

  • org.hibernate.test.annotations.JoinedSubclassTest
  • org.hibernate.test.annotations.join.JoinTest

Embeddable type is not resolved when building EntityMetamodel:

  • org.hibernate.test.annotations.embedded.many2one.EmbeddableWithMany2OneTest

Side affect due to BasicHibernateAnnotationsTest.testPolymorphism failure?

  • org.hibernate.test.annotations.entity.BasicHibernateAnnotationsTest.testSerialized org.hibernate.exception.ConstraintViolationException Caused by: org.h2.jdbc.JdbcSQLException Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_HF69MJ4YDYXUR8BHA09E6YUK4: PUBLIC.FOREST_NEAR FOREIGN KEY(FOREST_ID) REFERENCES PUBLIC.FOREST(ID)"; SQL statement: delete from Forest [23003-145]

@MapKeyClass is not supported yet.

  • org.hibernate.test.annotations.target.TargetTest

SQL strings added more than once:

  • org.hibernate.test.annotations.manytoonewithformula.ManyToOneWithFormulaTest (product.UK_product_idnf)

No support yet for referenced join columns unless they correspond with columns bound for an attribute binding.

  • org.hibernate.test.annotations.onetoone.OneToOneTest

org.hibernate.test.annotations.derivedidentities.bidirectional.OneToOneWithDerivedIdentityTest > testCase FAILED org.hibernate.test.annotations.derivedidentities.bidirectional.OneToOneWithDerivedIdentityTest > testSelectWithDerivedId FAILEDjava.lang.NullPointerException at OneToOneWithDerivedIdentityTest.java:107

org.hibernate.test.annotations.derivedidentities.bidirectional.OneToOneWithDerivedIdentityTest > testInsertFooAndBarWithDerivedId FAILED java.lang.StackOverflowError

Schema name is wrong:

  • org.hibernate.test.annotations.id.sequences.HibernateSequenceTest.testHibernateSequenceSchema Expected :OTHER_SCHEMA.hibernate_sequence Actual :hibernate_sequence

org.hibernate.test.annotations.lob.SerializableToBlobTypeTest.testTypeDefinition (Gail): Expected :org.hibernate.test.annotations.lob.ExplicitSerializableType Actual :org.hibernate.test.annotations.lob.ExplicitSerializable

org.hibernate.test.annotations.manytomany.ManyToManyMaxFetchDepth0Test > classMethod FAILED org.hibernate.testing.junit4.CallbackException Caused by: org.hibernate.cfg.NotYetImplementedException

org.hibernate.test.annotations.manytomany.ManyToManyTest > classMethod FAILED org.hibernate.testing.junit4.CallbackException Caused by: org.hibernate.cfg.NotYetImplementedException

Property accessor comparison of "field" with locale does not match, so tries to resolve a custom accessor:

  • org.hibernate.test.locale.LocaleTest.testMetadataWithLocale

org.hibernate.test.any.AnyTypeTest.testJoinFetchOfAnAnyTypeAttribute FAILED java.lang.Exception Caused by: org.hibernate.QueryException at AnyTypeTest.java:81 Caused by: org.hibernate.QueryException at AnyTypeTest.java:81 Caused by: org.hibernate.QueryException: could not resolve property: data of: org.hibernate.test.any.Person [select p from org.hibernate.test.any.Person p join fetch p.data]

org.hibernate.test.events.CallbackTest > testCallbacks FAILED java.lang.AssertionError at CallbackTest.java:104 java.lang.AssertionError: observer not notified of creation

No 2nd-level cache for collection (i.e., CollectionPersister.hasCache() is false, but it should be true):

  • org.hibernate.test.filter.DynamicFilterTest.testSecondLevelCachedCollectionsFiltering

Not-null property references a null or transient value: org.hibernate.test.cascade.circle.CascadeMergeToChildBeforeParentTest.testMergeData3Nodes org.hibernate.test.cascade.circle.CascadeMergeToChildBeforeParentTest.testMergeTransientChildBeforeTransientParent (org.hibernate.test.cascade.circle.Transport._org.hibernate.test.cascade.circle.Vehicle.transportsBackRef)

Table "HIBERNATE_UNIQUE_KEY" not found:

  • org.hibernate.test.legacy.IJ2Test.testUnionSubclass
  • org.hibernate.test.legacy.SQLFunctionsTest.testBlobClob
  • org.hibernate.test.subselect.SubselectTest.testCustomColumnReadAndWrite
  • org.hibernate.test.subselect.SubselectTest.testEntitySubselect
  • org.hibernate.test.subclassfilter.UnionSubclassFilterTest.testFiltersWithUnionSubclass
  • org.hibernate.test.propertyref.inheritence.union.UnionSubclassPropertyRefTest.testOneToOnePropertyRef
  • org.hibernate.test.propertyref.inheritence.discrim.SubclassPropertyRefTest.testOneToOnePropertyRef
  • org.hibernate.test.propertyref.basic.PropertyRefTest.testJoinFetchPropertyRef
  • org.hibernate.test.propertyref.basic.PropertyRefTest.testNonLazyBagKeyPropertyRef
  • org.hibernate.test.propertyref.basic.PropertyRefTest.testOneToOnePropertyRef
  • org.hibernate.test.legacy.MapTest.testMap()
  • org.hibernate.test.legacy.MapTest.testMapOneToOne()

org.hibernate.test.querycache.QueryCacheTest > testQueryCacheInvalidation FAILED java.lang.AssertionError at QueryCacheTest.java:219

org.hibernate.test.propertyref.basic.BasicPropertiesTest > testProperties FAILED java.lang.AssertionError at BasicPropertiesTest.java:67 java.lang.AssertionError: Expected :null Actual :foo1

SessionFactoryRegistry.INSTANCE still has a registration after removing the session factory and closing it (happens when running tests at the command line; does not happen when running test in Intellij):

  • org.hibernate.serialization.SessionFactorySerializationTest

Something is initialized when it shouldn't be (Gail):

  • org.hibernate.test.onetoone.formula.OneToOneFormulaTest.testOneToOneEmbeddedCompositeKey

An entity should be a HibernateProxy, but it is not:

  • org.hibernate.test.immutable.ImmutableTest.testChangeImmutableEntityProxyToModifiable
  • org.hibernate.test.immutable.ImmutableTest.testChangeImmutableEntityToModifiable

org.hibernate.test.ops.SaveOrUpdateTest > testSaveOrUpdateGotWithMutableProp FAILED java.lang.AssertionError at SaveOrUpdateTest.java:537 there is a comment that if there is no 2nd-level cache, it will fail; is that why?

SecondLevelCacheStatistics is null:

  • org.hibernate.test.cache.ehcache.EhCacheRegionTest

Entity mappings in hibernate.cfg.xml not found:

  • org.hibernate.test.cache.HibernateCacheTest

Tests that extend BaseUnitTestCase (and not BaseCoreFunctionalTestCase) that explicitly build Configuration (requires merging changes to testing code from metamodel branch). For now, they throw NotYetImplementedException: Configuration now wraps metamodel, so these need re-investigated.

  • org.hibernate.test.annotations.access.xml.XmlAccessTest
  • org.hibernate.test.annotations.id.JoinColumnOverrideTest
  • org.hibernate.test.annotations.id.sequences.JoinColumnOverrideTest
  • org.hibernate.test.nationalized.SimpleNationalizedTest
  • org.hibernate.test.naturalid.inheritance.spread.SpreadNaturalIdTest
  • org.hibernate.test.type.AttributeConverterTest

Tests that don't support new metamodel yet (only use configuration()):

  • other tests in envers and infinispan

Don't know why the following are passing with new metamodel (they are marked @FailureExpected in both metamodel and master branches):

  • org.hibernate.test.collection.set.PersistentSetNonLazyTest.testLoadChildCheckParentContainsChildCache

Don't know why the following are passing after integration into master (they are marked @FailureExpectedWithNewMetamodel in metamodel branch):

  • org.hibernate.test.instrument.runtime.JavassistInstrumentationTest.testLazy()
  • org.hibernate.test.instrument.runtime.JavassistInstrumentationTest.testLazyManyToOne
  • org.hibernate.test.instrument.runtime.JavassistInstrumentationTest.testManyToOneProxy
  • org.hibernate.test.instrument.runtime.JavassistInstrumentationTest.testSharedPKOneToOne

Envers integration tests are failing:

  • org.hibernate.envers.test.integration.merge.AddDelTest
  • org/hibernate.envers.test.integration.tools.SchemaExportTest
  • org/hibernate.envers.test.integration.proxy.QueryingWithProxyObjectTest

Notes (Steve)

  • parts of PluralAttributeBinding (elements, key, etc) need to expose org.hibernate.metamodel.spi.source.MetaAttributeContext; see org.hibernate.test.legacy.NonReflectiveBinderTest. Maybe good idea to introduce a contract for things that are or have a MetaAttributeContext
  • org.hibernate.test.multitenancy.schema.SchemaBasedMultiTenancyTest (and subclasses) are completely commented out atm.
  • org.hibernate.test.stats.StatsTest#testCollectionFetchVsLoad
  • org.hibernate.test.annotations.access.jpa.AccessMappingTest#testAccessOnClassAndId illustrates what i think is a problem in the binding code. The code in question is org.hibernate.metamodel.internal.source.annotations.entity.ConfiguredClass#checkExplicitJpaAttributeAccessAnnotationPlacedCorrectly; it errors if @Access(AccessType.PROPERTY) is places on a getter on a class which also states @Access(AccessType.PROPERTY) (and vice versa). Seems to me this should just warn the user.
  • I saw a few failures because metamodel does not seem to be able to find @Embeddables for @Embedded
  • Need to make sure we can force the Dialect to use in SchemaManagementTool delegates, rather than the (if set) Dialect on JdbcEnvironment associated with the Database. Or (better yet?) allow forcing the JdbcEnvironment used on Database.
  • Composite Jandex support currently assumes all/nothing. Meaning we assume that an incoming Jandex index holds all class/annotations. This causes some problems with EntityManagerFactoryBuilder because it partially builds a Jandex for "discovered" classes though not mapped or listed classes. INitially it had done this to support class enhancement. We just need to vberify this all works smoothly.