JPA composite key with single element using @IdClass, @OneToOne and non-primitive type causes Hibernate NPE

Viewed 30

I want to use a value-object to represent the primary key, even though in the DB it is still a varchar. Also, I do not want to use @EmbeddedId, due to the uglier queries one must write to access the key. Hence, I use @IdClass with a single element.

However, Hibernate tries to find a foreign key for my one-to-one relationship which is in the same table anyway causing an NPE. I used this guide.

The Exception:

Caused by: java.lang.NullPointerException at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1672) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)

Schema:

create table arrival
(
    reference_number  varchar(17) not null
    constraint arrival_pkey primary key
)

JPA Entity:

@Entity
@Table(name = "arrival")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@IdClass(value = ArrivalReferenceNumberId.class) // 
public class Arrival {

    @Id
    @OneToOne(optional = false, orphanRemoval = true)
    @JoinColumn(name = "reference_number", nullable = false)
    private ArrivalReferenceNumber referenceNumber;
}

The wrapper used by @IdClass:

public class ArrivalReferenceNumberId implements Serializable {

    private ArrivalReferenceNumber referenceNumber;

    // Getter; Setter; Equals & Hash ...
}

Lastly, the value object I want to use:

public class ArrivalReferenceNumber implements Serializable {

    private String value;

    ArrivalReferenceNumber() {
    }

    // Getter; Setter; Equals & Hash ...
}

I use the following test to check whether Hibernate started correctly against a local postgres db.

@DataJpaTest
@ActiveProfiles({
        ProfileRegistry.LOCAL,
        ProfileRegistry.TEST
})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ArrivalITTest {

    @Autowired
    private TestEntityManager em;

    @Test
    void contextLoads() {
        assertThat(em).isNotNull();
    }

}
0 Answers
Related