I’m mapping two entities 1:n where the many-side has a composite primary key. So far so good.
But when I embed one of the keys attributes in an object, hibernate shows me an error that it cannot find the field of the embedded object:
<code> at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
... 38 more
Caused by: java.lang.IllegalStateException: PostInitCallback queue could not be processed...
- PostInitCallbackEntry - VirtualIdEmbeddable(com.example.contract.Partner#{id})#finishInitialization
- PostInitCallbackEntry - EmbeddableMappingType(com.example.contract.Partner)#finishInitialization
at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:144)
... 42 more
Suppressed: org.hibernate.PropertyNotFoundException: Could not locate field name [personNumber] on class [com.example.contract.Partner]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:456)
...
Suppressed: org.hibernate.PropertyNotFoundException: Could not locate field name [personNumber] on class [com.example.contract.Partner]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:456)
...
</code>
<code> at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
... 38 more
Caused by: java.lang.IllegalStateException: PostInitCallback queue could not be processed...
- PostInitCallbackEntry - VirtualIdEmbeddable(com.example.contract.Partner#{id})#finishInitialization
- PostInitCallbackEntry - EmbeddableMappingType(com.example.contract.Partner)#finishInitialization
at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:144)
... 42 more
Suppressed: org.hibernate.PropertyNotFoundException: Could not locate field name [personNumber] on class [com.example.contract.Partner]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:456)
...
Suppressed: org.hibernate.PropertyNotFoundException: Could not locate field name [personNumber] on class [com.example.contract.Partner]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:456)
...
</code>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
... 38 more
Caused by: java.lang.IllegalStateException: PostInitCallback queue could not be processed...
- PostInitCallbackEntry - VirtualIdEmbeddable(com.example.contract.Partner#{id})#finishInitialization
- PostInitCallbackEntry - EmbeddableMappingType(com.example.contract.Partner)#finishInitialization
at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:144)
... 42 more
Suppressed: org.hibernate.PropertyNotFoundException: Could not locate field name [personNumber] on class [com.example.contract.Partner]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:456)
...
Suppressed: org.hibernate.PropertyNotFoundException: Could not locate field name [personNumber] on class [com.example.contract.Partner]
at org.hibernate.internal.util.ReflectHelper.findField(ReflectHelper.java:456)
...
Can anybody explain what’s going on here and how I can make it work?
These are my annotated classes:
<code>@Entity
public class Contract {
@Id
private Integer id;
private String something;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "contractId")
private final List<Partner> partners = new ArrayList<>();
}
@Entity
@IdClass(PartnerId.class)
public class Partner {
@Id private Integer contractId;
@Id private Person person;
private String role;
}
@Data
public class PartnerId {
private Integer contractId;
@Embedded
private Person person;
}
@Embeddable
public class Person {
private Integer personNumber;
}
</code>
<code>@Entity
public class Contract {
@Id
private Integer id;
private String something;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "contractId")
private final List<Partner> partners = new ArrayList<>();
}
@Entity
@IdClass(PartnerId.class)
public class Partner {
@Id private Integer contractId;
@Id private Person person;
private String role;
}
@Data
public class PartnerId {
private Integer contractId;
@Embedded
private Person person;
}
@Embeddable
public class Person {
private Integer personNumber;
}
</code>
@Entity
public class Contract {
@Id
private Integer id;
private String something;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "contractId")
private final List<Partner> partners = new ArrayList<>();
}
@Entity
@IdClass(PartnerId.class)
public class Partner {
@Id private Integer contractId;
@Id private Person person;
private String role;
}
@Data
public class PartnerId {
private Integer contractId;
@Embedded
private Person person;
}
@Embeddable
public class Person {
private Integer personNumber;
}