As an API user if I'm expected to use the _User_ interface, I think I
would expect the annotations to be defined on the interface, not on
the UserImpl.class .. as with the rest of mapping annotations.
I don't know about the technical requirements to make this
implementable; I guess you need some UserImpl class as a prototype?
If so wouldn't it make sense to have
@Entity @PrototypedBy(UserImpl.class)
public interface User {
@Id Long getUserId();
void setUserId(Long id);
}
public class UserImpl implements User {
...
}
And ideally I would expect the "prototype" class to be not needed / optional.
Finally, since I'd expect the setter / getter implementations in the
proxy to be generated by us, could we have them take care of
bi-directional relations, to update both sides of relation
automatically and correctly? I was speaking recently to a Ruby
developer who just switched to JavaEE, and he pointed out that this
requirement is long gone in other persistence APIs.
I know by experience this also frequently bites beginners, and even
experienced developers have to write code about this.. this looks like
a chance to evolve?
Sanne
On 21 March 2012 01:19, Steve Ebersole <steve(a)hibernate.org> wrote:
Forwarding a part of this discussion that got inadvertently limited
to
just Sanne and myself.
Bringing this back up because this is most likely not going to be
accepted into JPA 2.1. Anyway, I am all for going down the path that:
public interface User {
...
}
@Entity
@Proxy(proxyClass=User.class)
public class UserImpl implements User {
...
}
means that users would use User.class in all phases of the API:
User user = session.byId( User.class ).get( 1 );
EntityType<User> jpaEntityType = emf.getMetamodel().entity(User.class );
etc.
I think that is the cleanest path that allows generic-typed api.
-------- Original Message --------
Subject: Re: [hibernate-dev] Proxies and typing
Date: Thu, 26 Jan 2012 14:37:22 +0000
From: Sanne Grinovero <sanne(a)hibernate.org>
To: Steve Ebersole <steve(a)hibernate.org>
On 26 January 2012 14:02, Steve Ebersole <steve(a)hibernate.org> wrote:
> These emails are just between you and me. Not sure if thats what you
> intended. I erroneously replied to just you at one point but then sent to
> whole list also. Anyway, just mentioning...
Ah, sorry, didn't notice either. Well last reply then, will try resume
the public conversation if I have more comments.
> The idea of requiring the interface is appealing in a way. But, for
> example, there are odd inconsistencies then. For example
>
> User user = session.byId( User.class ).get( 1 );
>
> but then
>
> EntityType<UserImpl> jpaEntityType = emf.getMetamodel().entity(
> UserImpl.class )
>
>
> Which I guess is my biggest hang up. On one side we are saying that the
> impl is the entity and on the other saying the interface is the entity.
>
> You know me and consistency :)
I agree on consistency, but this is tricky, I'm not sure if you need
the UserImpl at all, maybe you can remove it from the MetaModel (maybe
after having read out other metadata from it).
Isn't such a mapping definition like a dirty workaround to actually
map the interface ?
Sanne
_______________________________________________
hibernate-dev mailing list
hibernate-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev