I have the following entities:
{{@Entity @Table(name = "A") public class A extends ... { @ManyToOne(cascade = {CascadeType.REFRESH}) @JoinColumn(name = "B_ID", nullable = false) private B b; ... }
@Entity @Table(name = "B") @Inheritance(strategy = InheritanceType.JOINED) public abstract class B extends ... { ... }
@Entity @Table(name = "B1") public class B1 extends B { @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "C_ID", nullable = true) private C c; ... }
@Entity @Table(name = "B2") public class B2 extends B { @Embedded private CommonPart p; ... }
@Embeddable public class CommonPart implements Serializable { @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) @JoinColumn(name = "D_ID", referencedColumnName = "ID") private D d; ... }
@Entity @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "C/D_S", allocationSize = 1, initialValue = 1) @Table(name = "C/D") @Inheritance(strategy = InheritanceType.JOINED) public class C/D extends ... { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_GENERATOR") @Column(name = "ID") protected Long id; ... }}}
But when I try to retrieve an A entity, Hibernate attempts to execute the following, illegal query to resolve the join with B:
{{SELECT b0_.id AS ID1_204_0_, ... b0_1_.c_id AS C_ID5_201_0_, ... {color:#14892c}*b0_2_.d_id*{color} AS D_ID_T9_202_0_, CASE WHEN b0_1_.id IS NOT NULL THEN 1 WHEN b0_2_.id IS NOT NULL THEN 2 WHEN b0_.id IS NOT NULL THEN 0 END AS clazz_0_, ... c5_.id AS ID1_205_5_, ... d6_.id AS ID1_130_6_, .... FROM b b0_ LEFT OUTER JOIN B1 b0_1_ ON b0_.id = b0_1_.id LEFT OUTER JOIN B2 b0_2_ ON b0_.id = b0_2_.id ... LEFT OUTER JOIN C c5_ ON b0_1_.c_id = c5_.id LEFT OUTER JOIN D d6_ ON {color:red}*b0_1_.d_id*{color} = d6_.id WHERE b0_.id = ? }}
which obviously fails.
In hibernate 4.3.9 & 4.3.11, this works fine. |
|