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

"Jason Pyeron" <[email protected]>
Newsgroups gmane.comp.java.hibernate.devel
Message-ID <[email protected]>
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: [email protected] [mailto:[email protected]]
> On Behalf Of Jason Pyeron
> Sent: Tuesday, April 21, 2020 9:23 AM
> To: [email protected]; [email protected]
> 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:[email protected]]
> Sent: Tuesday, April 21, 2020 1:32 AM
> To: '[email protected]' <[email protected]>
> 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
> [email protected]
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.