Make @MappedSuperclass annotation optional on superclasses of a class used as an IdClass
Description
Suppose we have the following:
public class CompositeKey implements Serializable {
private Long id1;
private Long id2;
public CompositeKey(Long id1, Long id2) {
super();
this.id1 = id1;
this.id2 = id2;
}
...
}
public class InheritedKey extends CompositeKey {
private Long id3;
public InheritedKey(Long id1, Long id2, Long id3) {
super(id1, id2);
this.id3 = id3;
}
...
}
@Entity(name = "IKE")
@IdClass(InheritedKey.class)
public class InheritedKeyEntity {
@Id
private Long id1;
@Id
private Long id2;
@Id
private Long id3;
private String name;
...
}
Currently, Hibernate does not include InheritedKey#id3 in InheritedKeyEntity's composite key unless InheritedKey is annotated with @MappedSuperclass.
A class used as an IdClass does not need any annotations (as opposed to a class used for an EmbeddedId class, which requires @Embeddable). Since the class used as an IdClass does not need to be annotated, it seems kind of strange that its superclass would need to be annotated with @MappedSuperclass in order for its fields/properties to be persistent. Since the field/property names must match what is annotated in an IdClass, it is clear that the field/property in a superclass is intended to be included in the ID.
The fix for this issue would make annotating the superclass of a class used as an IdClass with @MappedSuperclass optional.
If the same embeddable is used as an EmbeddedId, then the embeddable’s superclasses will still require {{@MappedSuperclass}} in order for its properties to be persistent in the EmbeddedId.
Suppose we have the following:
public class CompositeKey implements Serializable { private Long id1; private Long id2; public CompositeKey(Long id1, Long id2) { super(); this.id1 = id1; this.id2 = id2; } ... } public class InheritedKey extends CompositeKey { private Long id3; public InheritedKey(Long id1, Long id2, Long id3) { super(id1, id2); this.id3 = id3; } ... } @Entity(name = "IKE") @IdClass(InheritedKey.class) public class InheritedKeyEntity { @Id private Long id1; @Id private Long id2; @Id private Long id3; private String name; ... }
Currently, Hibernate does not include
InheritedKey#id3
inInheritedKeyEntity
's composite key unlessInheritedKey
is annotated with@MappedSuperclass
.A class used as an
IdClass
does not need any annotations (as opposed to a class used for anEmbeddedId
class, which requires@Embeddable
). Since the class used as anIdClass
does not need to be annotated, it seems kind of strange that its superclass would need to be annotated with@MappedSuperclass
in order for its fields/properties to be persistent. Since the field/property names must match what is annotated in anIdClass
, it is clear that the field/property in a superclass is intended to be included in the ID.The fix for this issue would make annotating the superclass of a class used as an
IdClass
with@MappedSuperclass
optional.If the same embeddable is used as an EmbeddedId, then the embeddable’s superclasses will still require {{@MappedSuperclass}} in order for its properties to be persistent in the EmbeddedId.