Skip to main content

[jsr338-experts] Re: proposal : @Entity on interfaces

  • From: Oliver Gierke <ogierke@...>
  • To: "jsr338-experts@..." <jsr338-experts@...>
  • Subject: [jsr338-experts] Re: proposal : @Entity on interfaces
  • Date: Fri, 9 Mar 2012 11:50:31 -0800
  • Accept-language: de-DE, en-US
  • Acceptlanguage: de-DE, en-US

Hi all,

great idea. Would it make sense to invert the mapping to point from the 
implementation class to the interface as a mapping the other way round would 
effectively create a bidirectional dependency. The interface referring to 
it's implementation feels a bit weird. What about

public interface Person {
  …
}

@Entity(typeAliasFor = Person.class)
public class PersonImpl implements Person {
  …
}

The persistence provider would then reject mapping constellations where more 
than one implementation class refers to the interface as type alias. With a 
mapping this way round one could even have interface and implementation in 
separate JARs being brought together at runtime.

Cheers,
Ollie

Am 09.03.2012 um 19:04 schrieb Steve Ebersole:

> I'd like to propose that JPA 2.1 allow @Entity on Java interfaces not 
> just classes.  The main reason is typing in spec contracts.  For domain 
> models that leverage interfaces, it is usually desirable to deal with 
> the interfaces over the implementation classes.  For example, such 
> applications would generally prefer to attempt to load or get a 
> reference to an instance based on the interface name as opposed to the 
> class name.  E.g.
> 
> public interface Person {
>     ...
> }
> 
> @Entity
> public class PersonImpl implements Person {
>     ...
> }
> 
> EntityManager em = ...;
> Person p = em.find( Person.class, theKey );
> 
> But this does not work today in a portable manner.  To work in the most 
> portable manner, I think the @Entity annotated interface also would need 
> to name the "persistent implementation class":
> 
> @Entity( impl = PersonImpl.class )
> public interface Person {
>     ...
> }
> 
> public class PersonImpl implements Person {
>     ...
> }
> 
> It could be up to each provider whether or not to support @Entity on an 
> interface that did not specify a "persistent implementation class".
> 
> Another way to look at this is as basically "aliasing" the entity type 
> metadata using the interface name instead of the implementation class name.
> 
> -Steve

-- 
/**
 * @author Oliver Gierke - Senior Member Technical Staff
 *
 * @param email ogierke@...
 * @param phone +49-351-30929001
 * @param fax   +49-351-418898439
 * @param skype einsdreizehn
 * @see http://www.olivergierke.de
 */

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail



[jsr338-experts] proposal : @Entity on interfaces

Steve Ebersole 03/09/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Oliver Gierke 03/09/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Steve Ebersole 03/09/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Bernd Müller 03/11/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

michael keith 03/11/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Matthew Adams 03/12/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

michael keith 03/12/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Oliver Gierke 03/12/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Werner Keil 03/12/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

michael keith 03/12/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Oliver Gierke 03/12/2012

[jsr338-experts] Re: proposal : @Entity on interfaces

Steve Ebersole 03/12/2012
 
 
Close
loading
Please Confirm
Close