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();
}
}