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
Organization PD Inc
Message-ID <[email protected]>
I spent the whole day tracking down / debugging / updating the org.hibernate.dialect.SQLServer2012Dialect and associated functions. I will continue tomorrow.

On a side note SQL Server does not allow the identity column to be specified in the insert. As such the insert SQL statements generated by EntityIdentityInsertAction are bad, resulting in a com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert explicit value for identity column in table XXXXX when IDENTITY_INSERT is set to OFF.



> -----Original Message-----
> From: [email protected] <[email protected]> On Behalf Of Jason
> Pyeron
> Sent: Tuesday, April 21, 2020 1:18 PM
> To: 'Hibernate Dev' <[email protected]>
> Subject: Re: [hibernate-dev] HHH-6044 / HHH-9662 and partial identifier generation - No part of a
> composite identifier may be null HibernateException
> 
> 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 <[email protected]>
> Sent: Tuesday, April 21, 2020 12:20 PM
> To: Jason Pyeron <[email protected]>
> Cc: Hibernate Dev <[email protected]>
> 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 <[email protected] <mailto:[email protected]> > 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: [email protected] <mailto:[email protected]>
> [mailto:[email protected] <mailto:[email protected]> ]
> > On Behalf Of Jason Pyeron
> > Sent: Tuesday, April 21, 2020 9:23 AM
> > To: [email protected] <mailto:[email protected]> ; hibernate-
> [email protected] <mailto:[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] <mailto:[email protected]> ]
> > Sent: Tuesday, April 21, 2020 1:32 AM
> > To: '[email protected] <mailto:[email protected]> ' <hibernate-
> [email protected] <mailto:[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] <mailto:[email protected]>
> > https://lists.jboss.org/mailman/listinfo/hibernate-dev
> 
> _______________________________________________
> hibernate-dev mailing list
> [email protected] <mailto:[email protected]>
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
> 
> _______________________________________________
> 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.