|
When trying to define join columns on a @OneToMany association using @JoinFormula inside a @JoinColumnsOrFormulas list, A null pointer exception is thrown since the the bind fails to treat the Ejb3Column as a formula one, and tries to access the Column part of it.
Stack trace: 2015-07-07 01:54:12 ERROR HibernateUtil:22 - Initial SessionFactory creation failed. java.lang.NullPointerException at org.hibernate.cfg.Ejb3Column.isNullable(Ejb3Column.java:185) at org.hibernate.cfg.annotations.CollectionBinder.buildCollectionKey(CollectionBinder.java:1091) at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1524) at org.hibernate.cfg.annotations.CollectionBinder.bindOneToManySecondPass(CollectionBinder.java:865) at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:780) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:719) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1665) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1640) at org.hibernate.boot.internal.MetadataBuildingProcess.build(MetadataBuildingProcess.java:282) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:396) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:82) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:692) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
A test case: table A int id (PK)
table B int id (PK)
table C int id (PK) int idB (FK to B.id) (PK)
table D int idA (FK to A.id) (PK) int idC (FK to C.id) (PK)
table E int idA (FK to A.id) (PK) int idB (FK to B.id) (PK)
class E{ @OneToMany @JoinColumnsOrFormulas( { @JoinColumnOrFormula(formula = @JoinFormula(value = "idA", referencedColumnName = "idA")), @JoinColumnOrFormula(formula = @JoinFormula(value = "(SELECT __C.id FROM C AS __C WHERE __C.idB=idB)", referencedColumnName = "idC")) }
) Set<D> ds = new HashSet<>(); }
|