Hi Thomas,

thanks for your answer.

On Tue, 16 Aug 2005, Thomas Vandahl wrote:

Thomas Fischer wrote:
On Tue, 2 Aug 2005, Henning P. Schmiedehausen wrote:
Thomas Fischer <[EMAIL PROTECTED]> writes:
[...]
Hm, personally, I always use torque.objectIsCaching = true. The reason is as follows: In most applications, I need transaction safety. Then, I like to separate the application into a data accesss layer and the presentation layer. But the presentation layer should be able to retrieve associated objects, in the bookstore example this would be e.g. to be able to ask a book for its author. If I want to make this transaction safe and would have set torque.objectIsCaching to false, then I would have to pass the database connection to the presentation layer, which is not what a presentation layer is about.

If I use the getXXX methods without a connection parameter, the expected behaviour from my point of view *is* a DB-hit.

No it is not, if you accept that one may want to cache a whole tree of objects. Imagine the following: I have loaded an Author ant his corresponding books in a transaction-safe manner, and stored the author somewhere (e.g in a Http session). Knowing that the associated books will also be stored with the author, I do not store them separately. (ok, for a single Author, it would be feasible to store his books separately, but consider a lost of authors and their associated books). Then I commit the transaction, and I know that all data I have in memory is consistent.

Some time after that I want to access the data I have stored, e.g. because the user has submitted a command in an HTML form to change the data. The only "official" (i.e. automatically generated) way to get the cached Books from an author is to use author.getBooks(). But I care about the data being consistent, so in no circumstances do I want to access the database, because this would break transaction safety and lead to inconsistent data if soneone elase has changed the data in the menatime. Especially, if, by some mistake, I did forget to read the books of an author, I want to know it. A logical way of knowing is that author.getBooks() returns null.

So in this scenario, the automatic db hit is very contraproductive, and there is no easy means to prevent it.

It is more questionable whether the implicit caching of the collections or related objects is a good idea at all. It hurts especially when using managers.

Then you should consider to set the generator property torque.objectIsCaching to false.


I guess that getXXX(Connection con) would be a good extension anyway, because it makes the set of methods more logical. This way, you can always collect your data in a transaction and provide it to the presentation layer in the context separately (we talk Velocity here, don't we? :-)

I am personally using xslt, but that does not play any role. The problem is that I have no idea to provide the methods when managers are turned on. The implementation without the connection asks the manager to provide the object, and there is no way I have found to tell the manager "get that object, but if it is not there, use the provided connection". So I did not implement it in objectWithManager.vm. Do you have any idea of how to solve this one ?


3) add a generator property torque.silentDbFetch, which is true by default. If set to false, the getXXX() methods without arguments will not access the
db silently, but return null if the associated objects has not been read
yet. Also, the method does not throw a Torque exception any more (which is
the main reason why using these methods is more convenient than
getXXX(boolean silentDbFetch) with silentDbFetch set to false).

Personally, I don't see that you gain much with this. As I understand it, this means that you need to prefetch all related objects in the business code in a transaction like

        Book b = BookPeer.retrieveByPK(id, con);
        b.getAuthor(con);
        context.put("book", b);

and then use

        $book.Author

in the presentation layer. Is that the case?

If you transfer it to java, yes. I would explicitly use book.getAuthor()
in the presentation layer.

I consider this difficult to read. You need to know that there is something cached under the hood to understand what's going on here...

I would not think so. If one knows that the property torque.objectIsCaching exists, in the generator, and one decides not to set it to false, one explicitly wants to have the caching. And if one has it, is it not legimite to say "I only want to use the cached data, and not hit the database"


I kindly ask you to sleep over it again.

One does not have to use it. It is not the default behaviour we are talking about (this will stay as it is, of course) but a decision you can take if you know what you are doing.

I would agree that if you have uncritical data you would not use it, but for critical data it is an absolute nightmare to have uncontrolled access to a database outside of transaction. Imaginge having to find an error in an application which has a problem like that ! Huh, it makes me shudder...

Thomas

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to