[hibernate-dev] HHH-6044 / HHH-9662 and partial identifier generation - No part of a composite identifier may be null HibernateException

Jason Pyeron jpyeron at pdinc.us
Tue Apr 21 13:18:26 EDT 2020


I have been reviewing the change set, I see where Fabio was going. This looks like it will address the Identify vs Sequence issue. That will still leave the IncrediblySillyJpaMapsIdMappedIdentifierValueMarshaller not handling the generation like the NormalMappedIdentifierValueMarshaller does.

 

Stack trace when using @Id Long id2:

 

EmbeddedComponentType(ComponentType).instantiate(EntityMode) line: 587

AbstractEntityTuplizer$NormalMappedIdentifierValueMarshaller.getIdentifier(Object, EntityMode, SharedSessionContractImplementor) line: 322

PojoEntityTuplizer(AbstractEntityTuplizer).getIdentifier(Object, SharedSessionContractImplementor) line: 219

 

Stack trace when using @Id @ManyToOne SomeEntity id2:

 

AbstractEntityTuplizer$IncrediblySillyJpaMapsIdMappedIdentifierValueMarshaller.getIdentifier(Object, EntityMode, SharedSessionContractImplementor) line: 365

AbstractEntityTuplizer$IncrediblySillyJpaMapsIdMappedIdentifierValueMarshaller.getIdentifier(Object, EntityMode, SharedSessionContractImplementor) line: 364

PojoEntityTuplizer(AbstractEntityTuplizer).getIdentifier(Object, SharedSessionContractImplementor) line: 219

 

-Jason

 

 

From: andrea boriero <andrea at hibernate.org> 
Sent: Tuesday, April 21, 2020 12:20 PM
To: Jason Pyeron <jpyeron at pdinc.us>
Cc: Hibernate Dev <hibernate-dev at lists.jboss.org>
Subject: Re: [hibernate-dev] HHH-6044 / HHH-9662 and partial identifier generation - No part of a composite identifier may be null HibernateException

 

there is a PR related to this issue ( https://github.com/hibernate/hibernate-orm/pull/3105), you can try to verify if it solves the problem

 

On Tue, 21 Apr 2020 at 16:15, Jason Pyeron <jpyeron at pdinc.us <mailto:jpyeron at pdinc.us> > wrote:

How can I help on HHH-9662 ?

I have found that this fails with sequences too, when the composite identifier is another entity.

This works:
    @Id
    @Column(name = "registration_number")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long registrationNumber;

    @Id
    @Column(name = "publisher_id")
    private Integer publisherId;

but, this does not:

    @Id
    @Column(name = "registration_number")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long registrationNumber;

    @Id
    @JoinColumn(name = "publisher_id")
    @ManyToOne
    private Publisher publisherId;

-Jason


> -----Original Message-----
> From: hibernate-dev-bounces at lists.jboss.org <mailto:hibernate-dev-bounces at lists.jboss.org>  [mailto:hibernate-dev-bounces at lists.jboss.org <mailto:hibernate-dev-bounces at lists.jboss.org> ]
> On Behalf Of Jason Pyeron
> Sent: Tuesday, April 21, 2020 9:23 AM
> To: hibernate-users at lists.jboss.org <mailto:hibernate-users at lists.jboss.org> ; hibernate-dev at lists.jboss.org <mailto:hibernate-dev at lists.jboss.org> 
> Subject: Re: [hibernate-dev] HHH-6044 / HHH-9662 and partial identifier generation - No
> part of a composite identifier may be null HibernateException
> 
> Turns out this issue may be a duplicate of a known issue, taking this over to the dev
> list.
> 
> 
> 
> org/hibernate/test/annotations/cid/CompositeIdIdentityTest.java:
> 
>      7  package org.hibernate.test.annotations.cid;
> 
>     48  @RequiresDialectFeature(DialectChecks.SupportsIdentityColumns.class)
> 
>     49  @TestForIssue( jiraKey = "HHH-9662" )
> 
>     50  public class CompositeIdIdentityTest extends BaseCoreFunctionalTestCase {
> 
>     51
> 
>     52          @Test
> 
>     53          @FailureExpected( jiraKey = "HHH-9662" )
> 
>     54          public void testCompositePkWithIdentity() throws Exception {
> 
>     55                  doInHibernate( this::sessionFactory, session -> {
> 
>     56                          Animal animal = new Animal();
> 
>     57                          animal.setSubId( 123L );
> 
>     58                          session.persist(animal);
> 
>     59                  } );
> 
>     60          }
> 
>     61
> 
>     70          @Entity
> 
>     71          @Table(name = "animal")
> 
>     72          @IdClass(IdWithSubId.class)
> 
>     73          public static class Animal {
> 
>     74
> 
>     75                  @Id
> 
>     76                  @GeneratedValue(strategy = GenerationType.IDENTITY)
> 
>     77                  private Long id;
> 
>     78
> 
>     79                  @Id
> 
>     80                  @Column(name = "sub_id")
> 
>     81                  private Long subId;
> 
>     82
> 
> 
> 
> 
> 
> From: Jason Pyeron [mailto:jpyeron at pdinc.us <mailto:jpyeron at pdinc.us> ]
> Sent: Tuesday, April 21, 2020 1:32 AM
> To: 'hibernate-users at lists.jboss.org <mailto:hibernate-users at lists.jboss.org> ' <hibernate-users at lists.jboss.org <mailto:hibernate-users at lists.jboss.org> >
> Subject: HHH-6044 and partial identifier generation - No part of a composite identifier
> may be null HibernateException
> 
> 
> 
> [note this is an issue with sequences too]
> 
> 
> 
> Quoting
> https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#i
> dentifiers-composite-nonaggregated
> 
> With non-aggregated composite identifiers, Hibernate also supports "partial" generation of
> the composite values.
> 
> Example 135. @IdClass with partial identifier generation using @GeneratedValue
> 
> 
> 
> I seem to be having the same issues as https://hibernate.atlassian.net/browse/HHH-6044
> 
> 
> 
> I have existing tables / Entities (simplified):
> 
> 
> 
> CREATE TABLE [cresaptown].[saar](
> 
>        [id] [bigint] IDENTITY(1,1) NOT NULL primary key
> 
> );
> 
> 
> 
> @Entity
> 
> @Table(schema = "cresaptown", name = "saar")
> 
> public class SystemAccessAuthorizationRequest
> 
> {
> 
>     @Id
> 
>     @GeneratedValue
> 
>     Long id;
> 
> }
> 
> 
> 
> CREATE TABLE [cresaptown].[signature](
> 
>        [rid] [bigint] IDENTITY(1,1) NOT NULL,
> 
>        [sid] [bigint] NOT NULL,
> 
>        PRIMARY KEY ([rid],[sid]),
> 
>        FOREIGN KEY([rid]) REFERENCES [cresaptown].[saar] ([id])
> 
> );
> 
> 
> 
> @Entity
> 
> @Table(schema = "cresaptown", name = "signature")
> 
> @IdClass(Signature.ID.class)
> 
> public class Signature
> 
> {
> 
>     @Id
> 
>     @Column(name = "sid")
> 
>     @GeneratedValue
> 
>     Long sid;
> 
> 
> 
>     @Id
> 
>     @JoinColumn(name = "rid")
> 
>     @ManyToOne
> 
>     SystemAccessAuthorizationRequest rid;
> 
> 
> 
>     public static class ID implements Serializable
> 
>     {
> 
>         Long sid;
> 
>         Long rid;
> 
>     }
> 
> }
> 
> 
> 
> A code fragment
> 
> 
> 
>             em.getTransaction().begin();
> 
>             SystemAccessAuthorizationRequest saar = new
> SystemAccessAuthorizationRequest();
> 
>             em.persist(saar);
> 
>             Signature sig = new Signature();
> 
>             sig.setRid(saar);
> 
>             em.persist(sig);
> 
>             em.getTransaction().commit();
> 
> 
> 
> gives this exception, but if I disable the null check in
> AbstractEntityTuplizer.getIdentifier, I get the same issue as in HHH-6044
> 
> 
> 
> javax.persistence.PersistenceException: org.hibernate.HibernateException: No part of a
> composite identifier may be null
> 
>      at
> org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
> 
>      at
> org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
> 
>      at
> org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
> 
>      at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:716)
> 
>      at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:696)
> 
>      at x.Testclass.x(Testclass.java:38)
> 
>      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 
>      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> 
>      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> 
>      at java.lang.reflect.Method.invoke(Unknown Source)
> 
>      at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> 
>      at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> 
>      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> 
>      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> 
>      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> 
>      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> 
>      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> 
>      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> 
>      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> 
>      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> 
>      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> 
>      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> 
>      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> 
>      at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89
> )
> 
>      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
> 
>      at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
> 
>      at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
> 
>      at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
> 
>      at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
> 
> Caused by: org.hibernate.HibernateException: No part of a composite identifier may be null
> 
>      at
> org.hibernate.tuple.entity.AbstractEntityTuplizer$IncrediblySillyJpaMapsIdMappedIdentifier
> ValueMarshaller.getIdentifier(AbstractEntityTuplizer.java:365)
> 
>      at
> org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.jav
> a:219)
> 
>      at
> org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersist
> er.java:5119)
> 
>      at
> org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister
> .java:4819)
> 
>      at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:294)
> 
>      at org.hibernate.event.internal.EntityState.getEntityState(EntityState.java:59)
> 
>      at
> org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventList
> ener.java:95)
> 
>      at
> org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventList
> ener.java:55)
> 
>      at
> org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventL
> istenerGroupImpl.java:102)
> 
>      at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:710)
> 
>      ... 25 more
> 
> 
> 
> 
> 
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org <mailto:hibernate-dev at lists.jboss.org> 
> https://lists.jboss.org/mailman/listinfo/hibernate-dev

_______________________________________________
hibernate-dev mailing list
hibernate-dev at lists.jboss.org <mailto:hibernate-dev at lists.jboss.org> 
https://lists.jboss.org/mailman/listinfo/hibernate-dev



More information about the hibernate-dev mailing list