472,119 Members | 978 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,119 software developers and data experts.

some problems with ORM concept....what do you think?

For all the ORM i have searched around, I have always found two big problems:

1) To update or delete a set of records you must first bring it to memory.
If you are inside a loop and have to do it n times, then you have to query
this set n times as well. Would be nice if ORM could make it easier (in a
strongly type manner) to call a dynamic query to directly update/delete
records.

2) I have noticed all ORM work with collection as thei return datatype of a
query. Well, you cannot add, delete, replace, or reorder the elements in this
collection...this restrict a lot the way you can work, specially if you are
iterating in a loop and have to make changes to the same table you are
iterating...

What are your opinions about it ?
Aug 19 '06 #1
12 2267
Sure you can do all of that with HQL in NHibernate.

J.

Bruce One wrote:
For all the ORM i have searched around, I have always found two big problems:

1) To update or delete a set of records you must first bring it to memory.
If you are inside a loop and have to do it n times, then you have to query
this set n times as well. Would be nice if ORM could make it easier (in a
strongly type manner) to call a dynamic query to directly update/delete
records.

2) I have noticed all ORM work with collection as thei return datatype of a
query. Well, you cannot add, delete, replace, or reorder the elements in this
collection...this restrict a lot the way you can work, specially if you are
iterating in a loop and have to make changes to the same table you are
iterating...

What are your opinions about it ?
Aug 19 '06 #2
I may have misexposed what I really meant.
I meant all ORM do HAVE these 2 problems below...
Hibernate (which I have already studied) works exaclty this ways, that is,
it has to bring to memory all records it needs to update/delete, and, since
it works with collections, you just cant update/delete any member of this
collection in such a way the collection gets "lost"....

"Jimmy" wrote:
Sure you can do all of that with HQL in NHibernate.

J.

Bruce One wrote:
For all the ORM i have searched around, I have always found two big problems:

1) To update or delete a set of records you must first bring it to memory.
If you are inside a loop and have to do it n times, then you have to query
this set n times as well. Would be nice if ORM could make it easier (in a
strongly type manner) to call a dynamic query to directly update/delete
records.

2) I have noticed all ORM work with collection as thei return datatype of a
query. Well, you cannot add, delete, replace, or reorder the elements in this
collection...this restrict a lot the way you can work, specially if you are
iterating in a loop and have to make changes to the same table you are
iterating...

What are your opinions about it ?

Aug 19 '06 #3
Bruce One <ra**@virtualsoftware.com.brwrote:
I may have misexposed what I really meant.
I meant all ORM do HAVE these 2 problems below...
Hibernate (which I have already studied) works exaclty this ways, that is,
it has to bring to memory all records it needs to update/delete, and, since
it works with collections, you just cant update/delete any member of this
collection in such a way the collection gets "lost"....
No, Hibernate (at least the Java version) does *not* have to fetch
records in order to update/delete them.

See
http://www.hibernate.org/hib_docs/v3...tch.html#batch
-direct

aka http://tinyurl.com/4kpug

and scroll down to "DML-style operations".

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 20 '06 #4
Well the example you linked to me works exaclty the way I put there...look at
a piece of the code presented in the page you forward to me...

..................
.................
// TAKE A LOOK AT THE getNamedQuery method. IT RETURNS ALL RECORDS THAT WILL
BE UPDATED....

ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}

tx.commit();
session.close();


"Jon Skeet [C# MVP]" wrote:
Bruce One <ra**@virtualsoftware.com.brwrote:
I may have misexposed what I really meant.
I meant all ORM do HAVE these 2 problems below...
Hibernate (which I have already studied) works exaclty this ways, that is,
it has to bring to memory all records it needs to update/delete, and, since
it works with collections, you just cant update/delete any member of this
collection in such a way the collection gets "lost"....

No, Hibernate (at least the Java version) does *not* have to fetch
records in order to update/delete them.

See
http://www.hibernate.org/hib_docs/v3...tch.html#batch
-direct

aka http://tinyurl.com/4kpug

and scroll down to "DML-style operations".

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 20 '06 #5
Bruce One <ra**@virtualsoftware.com.brwrote:
Well the example you linked to me works exaclty the way I put there...look at
a piece of the code presented in the page you forward to me...

.................
................
// TAKE A LOOK AT THE getNamedQuery method. IT RETURNS ALL RECORDS THAT WILL
BE UPDATED....

ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}

tx.commit();
session.close();
Please read my post more carefully. You didn't scroll down to the "DML-
style operations" section as I suggested.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 20 '06 #6
Bruce One wrote:
For all the ORM i have searched around, I have always found two big
problems:

1) To update or delete a set of records you must first bring it to
memory. If you are inside a loop and have to do it n times, then you
have to query this set n times as well. Would be nice if ORM could
make it easier (in a strongly type manner) to call a dynamic query to
directly update/delete records.
Not all O/R mappers force that on you. Some, like LLBLGen Pro (which
I'm the lead developer of), offer the ability to update/delete entities
directly in the persistent storage.

The reason why O/R mappers don't offer these query capabilities often
is based on the fact that it would make their internal caches
completely void.
2) I have noticed all ORM work with collection as thei return
datatype of a query. Well, you cannot add, delete, replace, or
reorder the elements in this collection...this restrict a lot the way
you can work, specially if you are iterating in a loop and have to
make changes to the same table you are iterating...
I'm not sure what your question is, but I don't recognize this
limitation in my work. Which 'ORM' frameworks are you talking about?

Frans
--
------------------------------------------------------------------------
Lead developer of LLBLGen Pro, the productive O/R mapper for .NET
LLBLGen Pro website: http://www.llblgen.com
My .NET blog: http://weblogs.asp.net/fbouma
Microsoft MVP (C#)
------------------------------------------------------------------------
Aug 20 '06 #7
Frans,
You mean you would pass a raw sql to your update/delete method? Or is it
done using Dynamic Query? If so, how an Update command like below would be
called in your BusinessLogic, in such a way you can use all Strongly-Typed
fields?

Update Customers
Set CustomerName = "Bruce"
,CustomerAge = 30
WHERE CustomerID = 30
"Frans Bouma [C# MVP]" wrote:
Bruce One wrote:
For all the ORM i have searched around, I have always found two big
problems:

1) To update or delete a set of records you must first bring it to
memory. If you are inside a loop and have to do it n times, then you
have to query this set n times as well. Would be nice if ORM could
make it easier (in a strongly type manner) to call a dynamic query to
directly update/delete records.

Not all O/R mappers force that on you. Some, like LLBLGen Pro (which
I'm the lead developer of), offer the ability to update/delete entities
directly in the persistent storage.

The reason why O/R mappers don't offer these query capabilities often
is based on the fact that it would make their internal caches
completely void.
2) I have noticed all ORM work with collection as thei return
datatype of a query. Well, you cannot add, delete, replace, or
reorder the elements in this collection...this restrict a lot the way
you can work, specially if you are iterating in a loop and have to
make changes to the same table you are iterating...

I'm not sure what your question is, but I don't recognize this
limitation in my work. Which 'ORM' frameworks are you talking about?

Frans
--
------------------------------------------------------------------------
Lead developer of LLBLGen Pro, the productive O/R mapper for .NET
LLBLGen Pro website: http://www.llblgen.com
My .NET blog: http://weblogs.asp.net/fbouma
Microsoft MVP (C#)
------------------------------------------------------------------------
Aug 20 '06 #8
Jon, I saw it. But you must agree this is not Dynamic Query, it does not deal
with strongly-typed fields, its just raw sql, as the code extracted from the
Hibernate page (below)...

String hqlUpdate = "update Customer c set c.name = :newName where c.name =
:oldName";
"Jon Skeet [C# MVP]" wrote:
Bruce One <ra**@virtualsoftware.com.brwrote:
Well the example you linked to me works exaclty the way I put there...look at
a piece of the code presented in the page you forward to me...

.................
................
// TAKE A LOOK AT THE getNamedQuery method. IT RETURNS ALL RECORDS THAT WILL
BE UPDATED....

ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}

tx.commit();
session.close();

Please read my post more carefully. You didn't scroll down to the "DML-
style operations" section as I suggested.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 20 '06 #9
Bruce One <ra**@virtualsoftware.com.brwrote:
Jon, I saw it. But you must agree this is not Dynamic Query, it does not deal
with strongly-typed fields, its just raw sql, as the code extracted from the
Hibernate page (below)...

String hqlUpdate = "update Customer c set c.name = :newName where c.name =
:oldName";
No, it's not just raw SQL. You can use the properties to perform a
path, eg

"delete Customer c where c.address.zipcode = ...."

What else would you want out of ORM when it comes to updating or
deleting?

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 20 '06 #10
Bruce One wrote:
Frans,
You mean you would pass a raw sql to your update/delete method? Or is
it done using Dynamic Query? If so, how an Update command like below
would be called in your BusinessLogic, in such a way you can use all
Strongly-Typed fields?

Update Customers
Set CustomerName = "Bruce"
,CustomerAge = 30
WHERE CustomerID = 30
This uses a dummy entity instance to contain the NEW values for the
fields you're going to set. This also means that I can use an
expression.

CustomerEntity customer = new CustomerEntity();
customer.CustomerName = "Bruce";
customer.CustomerAge = 30;
using(DataAccessAdapter adapter = new DataAccessAdapter())
{
adapter.UpdateEntitiesDirectly(customer,
new RelationPredicateBucket(
CustomerFields.CustomerID==30));
}

I also could have increased your age with 10% :) ->

CustomerEntity customer = new CustomerEntity();
customer.CustomerName = "Bruce";
customer.CustomerAge.ExpressionToApply = (
CustomerFields.CustomerAge +
(CustomerFields.CustomerAge * 0.01f));
using(DataAccessAdapter adapter = new DataAccessAdapter())
{
adapter.UpdateEntitiesDirectly(customer,
new RelationPredicateBucket(
CustomerFields.CustomerID==30));
}

All strongly-typed compile time checked code.

FB
>

"Frans Bouma [C# MVP]" wrote:
Bruce One wrote:
For all the ORM i have searched around, I have always found two
big problems:
>
1) To update or delete a set of records you must first bring it to
memory. If you are inside a loop and have to do it n times, then
you have to query this set n times as well. Would be nice if ORM
could make it easier (in a strongly type manner) to call a
dynamic query to directly update/delete records.
Not all O/R mappers force that on you. Some, like LLBLGen Pro
(which I'm the lead developer of), offer the ability to
update/delete entities directly in the persistent storage.

The reason why O/R mappers don't offer these query capabilities
often is based on the fact that it would make their internal caches
completely void.
2) I have noticed all ORM work with collection as thei return
datatype of a query. Well, you cannot add, delete, replace, or
reorder the elements in this collection...this restrict a lot the
way you can work, specially if you are iterating in a loop and
have to make changes to the same table you are iterating...
I'm not sure what your question is, but I don't recognize this
limitation in my work. Which 'ORM' frameworks are you talking about?

--
------------------------------------------------------------------------
Lead developer of LLBLGen Pro, the productive O/R mapper for .NET
LLBLGen Pro website: http://www.llblgen.com
My .NET blog: http://weblogs.asp.net/fbouma
Microsoft MVP (C#)
------------------------------------------------------------------------
Aug 21 '06 #11
Well Jon,
Its not 100% dynamic either...since you have to know table field names, as
in "c.name", rather than strongly typed fields that you could access through
intellisense...

"Jon Skeet [C# MVP]" wrote:
Bruce One <ra**@virtualsoftware.com.brwrote:
Jon, I saw it. But you must agree this is not Dynamic Query, it does not deal
with strongly-typed fields, its just raw sql, as the code extracted from the
Hibernate page (below)...

String hqlUpdate = "update Customer c set c.name = :newName where c.name =
:oldName";

No, it's not just raw SQL. You can use the properties to perform a
path, eg

"delete Customer c where c.address.zipcode = ...."

What else would you want out of ORM when it comes to updating or
deleting?

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 21 '06 #12
Bruce One <ra**@virtualsoftware.com.brwrote:
Its not 100% dynamic either...since you have to know table field names, as
in "c.name", rather than strongly typed fields that you could access through
intellisense...
That's the current state of ORM though - it's no different in the rest
of the querying etc.

It feels like you're desperately trying to find reasons not to use
ORM...

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Aug 21 '06 #13

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by vivek | last post: by
18 posts views Thread by gabriel | last post: by
2 posts views Thread by Vamshi | last post: by
1 post views Thread by Wayne Shu | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.