Re: [hibernate-dev] IdClass superclasses
I've created https://hibernate.atlassian.net/browse/HHH-13776. Thanks! Gail On Tue, Dec 10, 2019 at 1:30 PM Steve Ebersole wrote: > Actually I was thinking of @EmbeddedId, but you were asking about @IdClass. > > I think (2) sounds more natural. > > > On Tue, Dec 10, 2019 at 3:12 PM Steve Ebersole > wrote: > >> To me this is perfectly consistent with how inheritance works in entity >> hierarchies. Unless a super type is marked with @Entity >> or @MappedSuperclass, the "attributes" defined on that specific class are >> not picked up. >> >> Maybe I'm misunderstanding you? >> >> On Mon, Dec 9, 2019 at 1:58 PM Gail Badner wrote: >> >>> Hi, >>> >>> 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. >>> >>> I think there are some improvements that can be made. >>> >>> 1) As you can see, the entity, itself, has all of the ID fields >>> annotated. >>> An improvement would be for Hibernate to ensure that all mapped ID >>> properties have been detected, and throw an exception if this is not the >>> case. >>> >>> 2) 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 an >>> ID. Perhaps we could make annotating the superclass with >>> {{@MappedSuperclass}} optional? >>> >>> Opinions? >>> >>> Thanks, >>> Gail >>> ___ >>> hibernate-dev mailing list >>> hibernate-dev@lists.jboss.org >>> https://lists.jboss.org/mailman/listinfo/hibernate-dev >>> >>> ___ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev
Re: [hibernate-dev] IdClass superclasses
Actually I was thinking of @EmbeddedId, but you were asking about @IdClass. I think (2) sounds more natural. On Tue, Dec 10, 2019 at 3:12 PM Steve Ebersole wrote: > To me this is perfectly consistent with how inheritance works in entity > hierarchies. Unless a super type is marked with @Entity > or @MappedSuperclass, the "attributes" defined on that specific class are > not picked up. > > Maybe I'm misunderstanding you? > > On Mon, Dec 9, 2019 at 1:58 PM Gail Badner wrote: > >> Hi, >> >> 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. >> >> I think there are some improvements that can be made. >> >> 1) As you can see, the entity, itself, has all of the ID fields annotated. >> An improvement would be for Hibernate to ensure that all mapped ID >> properties have been detected, and throw an exception if this is not the >> case. >> >> 2) 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 an >> ID. Perhaps we could make annotating the superclass with >> {{@MappedSuperclass}} optional? >> >> Opinions? >> >> Thanks, >> Gail >> ___ >> hibernate-dev mailing list >> hibernate-dev@lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/hibernate-dev >> >> ___ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev
Re: [hibernate-dev] IdClass superclasses
To me this is perfectly consistent with how inheritance works in entity hierarchies. Unless a super type is marked with @Entity or @MappedSuperclass, the "attributes" defined on that specific class are not picked up. Maybe I'm misunderstanding you? On Mon, Dec 9, 2019 at 1:58 PM Gail Badner wrote: > Hi, > > 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. > > I think there are some improvements that can be made. > > 1) As you can see, the entity, itself, has all of the ID fields annotated. > An improvement would be for Hibernate to ensure that all mapped ID > properties have been detected, and throw an exception if this is not the > case. > > 2) 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 an > ID. Perhaps we could make annotating the superclass with > {{@MappedSuperclass}} optional? > > Opinions? > > Thanks, > Gail > ___ > hibernate-dev mailing list > hibernate-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/hibernate-dev > > ___ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev
[hibernate-dev] IdClass superclasses
Hi, 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. I think there are some improvements that can be made. 1) As you can see, the entity, itself, has all of the ID fields annotated. An improvement would be for Hibernate to ensure that all mapped ID properties have been detected, and throw an exception if this is not the case. 2) 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 an ID. Perhaps we could make annotating the superclass with {{@MappedSuperclass}} optional? Opinions? Thanks, Gail ___ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev