jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Klimetschek <aklim...@day.com>
Subject Re: Content Object Mapping - jcrom.org
Date Wed, 06 Feb 2008 18:55:21 GMT
Hi all!

Looks nice and simple. A colleague of mine at Mindquarry did a jcr- 
persistence framework that is very, very similar to JPA. I can't  
remember why he did not use it directly, so he recreated the basic  
annotation classes like Entity, ID or NamedQuery. Probably because you  
need some special jcr-compatible extensions.

Here is an example [4] which would map to /users/*. Note the  
parentFolder setting of @Entity and also that querying is just like in  
JPA, but using XPath instead:


@SerializationName("user")
@Entity(parentFolder=User.PARENT_FOLDER)
@NamedQueries({
     @NamedQuery(name="userByLogin", query="/users/{$userId}"),
     @NamedQuery(name="allUsers", query="/users/*[local-name() !=  
'photos']"),
     @NamedQuery(name="getUsersForTeam", query="/users/*[jcr:content/ 
user/teams/item/@reference = /teamspaces/{$teamId}/@jcr:uuid]")
})
public class User  {

     public static final String PARENT_FOLDER = "users";

     @Id
     private String login = "";
     private String pwd = "";

     public String firstname = "";
     public String lastname = "";

     private List<String> skills;
     private String[] skillsArray;

     private List<Team> teams;

     public Group group;

     .....
}


Example of creating/querying objects:


	Team team = makeTestTeam();   // new Team() + setting values
         currentSession().persist(team);

         List<Team> teams = new LinkedList<Team>();
         teams.add(team);
         User user = makeTestUser();  // new User() + setting values
         user.setTeams(teams);

         currentSession().persist(user);

         Session session = sessionFactory_.currentSession();
         List<Object> queryResult = session.query("getUsersForTeam",  
TEST_TEAM_ID);

         assertEquals(1, queryResult.size());


See the framework [1], API classes (eg. Entity) at [2], and the test  
code for more samples [3]. Note that there is no documentation online  
apart from the code.

The implemenation allows for reading/writing full object graphs, ie. a  
field in an object referencing another object that is also mapped to  
JCR would get read/written along the way (storing only the object Id  
in JCR, but preferable would be the JCR path of the referenced  
object). The JCR structure was custom (it was XMLish, as we stored XML  
documents directly in a different part of the code), but a Transformer  
interface abstracts from the special Java <-> JCR mapping [5].

In the end, we were not so happy with this approach because it seemed  
to much abstraction from our main API JCR and created yet another  
caching location (the managed object pool). But we probably added too  
much abstraction (fully JCR-independent interfaces that were  
implemented by the annotated objects, yet another Session class,  
etc.)...

Here is the executive summary of the pros and cons (which you probably  
know from OCM or JCROM):

Advantages:
+ full object graphs supported
+ easy-to-run queries, defined at the object itself
+ code completion for properties

Disadvantages:
- pooling = caching needed
- another hard-to-debug abstraction
- just a copy of JPA, not using it directly

Regards,
Alex

[1] http://www.mindquarry.org/repos/mindquarry-collaboration-server/trunk/mindquarry-persistence/

[2] API: http://www.mindquarry.org/repos/mindquarry-collaboration-server/trunk/mindquarry-persistence/persistence-api/src/main/java/com/mindquarry/persistence/api/

[3] Test code: http://www.mindquarry.org/repos/mindquarry-collaboration-server/trunk/mindquarry-persistence/jcr-persistence/src/test/java/com/mindquarry/persistence/jcr/

[4] Example annotated class: http://www.mindquarry.org/repos/mindquarry-collaboration-server/trunk/mindquarry-persistence/jcr-persistence/src/test/java/com/mindquarry/persistence/jcr/User.java

[5] "Transformers", mapping Java <-> JCR: http://www.mindquarry.org/repos/mindquarry-collaboration-server/trunk/mindquarry-persistence/jcr-persistence/src/main/java/com/mindquarry/persistence/jcr/trafo/

Am 05.02.2008 um 12:48 schrieb David Nuescheler:

> hi all,
>
> Olafur Gauti Gudmundsson pointed me today to his effort called JCROM
> (pronounced "Jack-rom"). [1]
>
> I am excited about the refreshing, quick and simple annotation based
> approach [2]
> and would like to find out what everybody's thoughts are on possibly
> finding synergies
> with the ocm framework that we have in Jackrabbit.
>
> regards,
> david
>
> [1] http://jcrom.org
> [2] http://code.google.com/p/jcrom/wiki/TwoMinuteIntro

--
Alexander Klimetschek
alexander.klimetschek@day.com





Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message