You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Zach Visagie <za...@ipay.co.za> on 2008/03/18 10:40:04 UTC

abator auto generated keys, multiple databases and domain relationships

Hi all

I'm relatively new to ibatis, so sorry for the long mail. We've got
basic web admin applications (using spring) for a transactional type
product, which needs to support multiple database vendors. Some of the
tables are quite denormalized so that's why I like ibatis over ORM stuff
and my superiors don't like background magic and prefer simplicity above
all and they like sql above ORM. I've also been tasked to improve
development speed, so we are using abator.

A couple of questions:
1. Abator auto generated keys.
Is it possible for abator to use the auto_generated keys feature,
instead of using a query? We have a custom connection pool able to
return them even for postgres.

2. What strategies do you recommend for supporting multiple db vendors?
The basic abator stuff should work on most db's or am I mistaken? This
is also the reason for question 1, since I was hoping to generate the
abator stuff from a single db and use it for the others and don't want
the DAO's to have db specific stuff if I can avoid it.

I thought to maybe add additional sqlmaps for any advanced requirements
beyond abator dao's. And could have db specific queries for report-like
situations in different sqlMaps loaded on startup based on db.

3. What is the estimated work for modifying abator to use velocity or
freemarker templates for modifying code generation?

4. I want to expose relationships in domain classes to the UI but abator
is unable to provide that. I figure that it will still save me on time
to use abator and just manage the relationships in the service layer and
in abstract super classes for the domain objects.
UI <-> Service <-> DAO

User
name:String
roles:List

(AbatorGenerated)
AdminUser extends User
name:String

public void createUser( User user )
{
  userTableDAO.insert( user );
  List<Role> roles = user.getRoles();
  for( Role role : roles )
  {
    AdminUserRoleLnk lnk =  new AdminUserRoleLnk( );
    lnk.setAdminUserId( user.getId( ) );
    lnk.setAdminRoleId( role.getId( ) );
    adminUserRoleLnkDAO.insert( lnk );
  }
}

The problem comes in an extra iteration needed for retrieving the user's
roles, as the following example shows.

public List<User> findUsers( ) 
{
  AdminUserExample example = new AdminUserExample( );
  example.setOrderByClause( "username" );
  List<User> users = adminUserDAO.selectByExample( example  );
  for( User u : users )
  {
    List<Role> roles = getUserRoles( u.getId() );
    u.setRoles( roles );
  }
  return users;	
}

I can live with it for smaller tables, since performance is not a major
requirement, but any other suggestions? Is there any way to pass a row
handler down to the DAO? I don't see a way to pass a row handler to the
spring dao classes, or am I just missing it or is there some other way
to process each row? Of course this I'd like in the context of minimal
interference with generated code and minimal work effort, which is a
high priority due to many tables.

Regards
Zach










Re: abator auto generated keys, multiple databases and domain relationships

Posted by Zach Visagie <za...@ipay.co.za>.
On Tue, 2008-03-18 at 11:40 +0200, Zach Visagie wrote:
> A couple of questions:
> 1. Abator auto generated keys.
> Is it possible for abator to use the auto_generated keys feature,
> instead of using a query? We have a custom connection pool able to
> return them even for postgres.

sorry only now saw issue 142, that auto generated keys not supported in
ibatis
https://issues.apache.org/jira/browse/IBATIS-142

I'm sad because my superior asked specifically about it, when I demo'd.
How is the progress in getting in implemented, does anyone know?

z


Re: abator auto generated keys, multiple databases and domain relationships

Posted by Zach Visagie <za...@ipay.co.za>.
On Tue, 2008-03-18 at 09:11 -0500, Jeff Butler wrote:
> now.  As far as multiple databases, I know Brandon has made this work
> by passing the query string as an unresolved property to the
> <generatedKey> element - which will cause Abator to leave the property
> in the generated <selectKey> element - so you can pass the db specific
> query string at runtime.  Use Abator from SVN for that support.

Cool thanks just what I need!

> 3. There are no plans to use freemarker or velocity for code
> generation in Abator.  If I recall correctly, someone posted a
> freemarker implementation on the list quite a while ago.

Ok, thanks, was just wondering. The current implementation should be
fine for my needs.

> 4. There are many threads on the user list discussing Abator and table
> relationships.  Your strategy is fine, but I would also suggest
> looking at the iBATIS support for the "groupBy" function -
> this *might* yield better performance in some circumstances.

I have looked at those, but was hoping to find a simple abator based
approach. But I'm happy enough for now, thanks.

> Jeff Butler
> 
> 
>  
> On Tue, Mar 18, 2008 at 4:40 AM, Zach Visagie <za...@ipay.co.za>
> wrote:
>         Hi all
>         
>         I'm relatively new to ibatis, so sorry for the long mail.
>         We've got
>         basic web admin applications (using spring) for a
>         transactional type
>         product, which needs to support multiple database vendors.
>         Some of the
>         tables are quite denormalized so that's why I like ibatis over
>         ORM stuff
>         and my superiors don't like background magic and prefer
>         simplicity above
>         all and they like sql above ORM. I've also been tasked to
>         improve
>         development speed, so we are using abator.
>         
>         A couple of questions:
>         1. Abator auto generated keys.
>         Is it possible for abator to use the auto_generated keys
>         feature,
>         instead of using a query? We have a custom connection pool
>         able to
>         return them even for postgres.
>         
>         2. What strategies do you recommend for supporting multiple db
>         vendors?
>         The basic abator stuff should work on most db's or am I
>         mistaken? This
>         is also the reason for question 1, since I was hoping to
>         generate the
>         abator stuff from a single db and use it for the others and
>         don't want
>         the DAO's to have db specific stuff if I can avoid it.
>         
>         I thought to maybe add additional sqlmaps for any advanced
>         requirements
>         beyond abator dao's. And could have db specific queries for
>         report-like
>         situations in different sqlMaps loaded on startup based on db.
>         
>         3. What is the estimated work for modifying abator to use
>         velocity or
>         freemarker templates for modifying code generation?
>         
>         4. I want to expose relationships in domain classes to the UI
>         but abator
>         is unable to provide that. I figure that it will still save me
>         on time
>         to use abator and just manage the relationships in the service
>         layer and
>         in abstract super classes for the domain objects.
>         UI <-> Service <-> DAO
>         
>         User
>         name:String
>         roles:List
>         
>         (AbatorGenerated)
>         AdminUser extends User
>         name:String
>         
>         public void createUser( User user )
>         {
>          userTableDAO.insert( user );
>          List<Role> roles = user.getRoles();
>          for( Role role : roles )
>          {
>            AdminUserRoleLnk lnk =  new AdminUserRoleLnk( );
>            lnk.setAdminUserId( user.getId( ) );
>            lnk.setAdminRoleId( role.getId( ) );
>            adminUserRoleLnkDAO.insert( lnk );
>          }
>         }
>         
>         The problem comes in an extra iteration needed for retrieving
>         the user's
>         roles, as the following example shows.
>         
>         public List<User> findUsers( )
>         {
>          AdminUserExample example = new AdminUserExample( );
>          example.setOrderByClause( "username" );
>          List<User> users = adminUserDAO.selectByExample( example  );
>          for( User u : users )
>          {
>            List<Role> roles = getUserRoles( u.getId() );
>            u.setRoles( roles );
>          }
>          return users;
>         }
>         
>         I can live with it for smaller tables, since performance is
>         not a major
>         requirement, but any other suggestions? Is there any way to
>         pass a row
>         handler down to the DAO? I don't see a way to pass a row
>         handler to the
>         spring dao classes, or am I just missing it or is there some
>         other way
>         to process each row? Of course this I'd like in the context of
>         minimal
>         interference with generated code and minimal work effort,
>         which is a
>         high priority due to many tables.
>         
>         Regards
>         Zach
>         
>         
>         
>         
>         
>         
>         
>         
>         
> 


Re: abator auto generated keys, multiple databases and domain relationships

Posted by Jeff Butler <je...@gmail.com>.
1. iBATIS supports generated keys through the use of a query (not the JDBC
3.0 support for generated keys).  Abator supports this too through the
<generatedKey> configuration element.  I doubt that iBATIS 2.x will support
JDBC 3.0 features, so this is what you must use for now.  As far as multiple
databases, I know Brandon has made this work by passing the query string as
an unresolved property to the <generatedKey> element - which will cause
Abator to leave the property in the generated <selectKey> element - so you
can pass the db specific query string at runtime.  Use Abator from SVN for
that support.

2. There are many threads on the user list about supporting multiple
databases.

3. There are no plans to use freemarker or velocity for code generation in
Abator.  If I recall correctly, someone posted a freemarker implementation
on the list quite a while ago.

4. There are many threads on the user list discussing Abator and table
relationships.  Your strategy is fine, but I would also suggest looking at
the iBATIS support for the "groupBy" function - this *might* yield better
performance in some circumstances.

Jeff Butler



On Tue, Mar 18, 2008 at 4:40 AM, Zach Visagie <za...@ipay.co.za> wrote:

> Hi all
>
> I'm relatively new to ibatis, so sorry for the long mail. We've got
> basic web admin applications (using spring) for a transactional type
> product, which needs to support multiple database vendors. Some of the
> tables are quite denormalized so that's why I like ibatis over ORM stuff
> and my superiors don't like background magic and prefer simplicity above
> all and they like sql above ORM. I've also been tasked to improve
> development speed, so we are using abator.
>
> A couple of questions:
> 1. Abator auto generated keys.
> Is it possible for abator to use the auto_generated keys feature,
> instead of using a query? We have a custom connection pool able to
> return them even for postgres.
>
> 2. What strategies do you recommend for supporting multiple db vendors?
> The basic abator stuff should work on most db's or am I mistaken? This
> is also the reason for question 1, since I was hoping to generate the
> abator stuff from a single db and use it for the others and don't want
> the DAO's to have db specific stuff if I can avoid it.
>
> I thought to maybe add additional sqlmaps for any advanced requirements
> beyond abator dao's. And could have db specific queries for report-like
> situations in different sqlMaps loaded on startup based on db.
>
> 3. What is the estimated work for modifying abator to use velocity or
> freemarker templates for modifying code generation?
>
> 4. I want to expose relationships in domain classes to the UI but abator
> is unable to provide that. I figure that it will still save me on time
> to use abator and just manage the relationships in the service layer and
> in abstract super classes for the domain objects.
> UI <-> Service <-> DAO
>
> User
> name:String
> roles:List
>
> (AbatorGenerated)
> AdminUser extends User
> name:String
>
> public void createUser( User user )
> {
>  userTableDAO.insert( user );
>  List<Role> roles = user.getRoles();
>  for( Role role : roles )
>  {
>    AdminUserRoleLnk lnk =  new AdminUserRoleLnk( );
>    lnk.setAdminUserId( user.getId( ) );
>    lnk.setAdminRoleId( role.getId( ) );
>    adminUserRoleLnkDAO.insert( lnk );
>  }
> }
>
> The problem comes in an extra iteration needed for retrieving the user's
> roles, as the following example shows.
>
> public List<User> findUsers( )
> {
>  AdminUserExample example = new AdminUserExample( );
>  example.setOrderByClause( "username" );
>  List<User> users = adminUserDAO.selectByExample( example  );
>  for( User u : users )
>  {
>    List<Role> roles = getUserRoles( u.getId() );
>    u.setRoles( roles );
>  }
>  return users;
> }
>
> I can live with it for smaller tables, since performance is not a major
> requirement, but any other suggestions? Is there any way to pass a row
> handler down to the DAO? I don't see a way to pass a row handler to the
> spring dao classes, or am I just missing it or is there some other way
> to process each row? Of course this I'd like in the context of minimal
> interference with generated code and minimal work effort, which is a
> high priority due to many tables.
>
> Regards
> Zach
>
>
>
>
>
>
>
>
>
>