I had an interesting conversation at Jazoon with a fellow who has a simple problem that he can't seem to get to work in OpenJPA without using implementation specific APIs.

He has a Department and Employees in a OneToMany and ManyToOne relationship.

He has the Employee.department field lazily loaded because it's just not needed in most application usages.

The application code wants to get the Department.id after querying Employees.

The simple employee.getDepartment().getId() doesn't need to go to the database, since the department id was loaded from the database when the employee was fetched. And yet, OpenJPA goes to the database in order to instantiate all the values in the department object, even though all the data that the application needs (id) is already in memory.

This case was one of the big reasons we implemented the hollow state of the object, so the id would always be available. The employee.getDepartment() should simply create a hollow Department based on the id and await further action by the user. If all the user needs is the id, it's available. If any other field is referenced, then OpenJPA should go to the database and fetch the load fetch group of the field that's fetched. If OpenJPA eagerly loads the department based on the getId method, it defeats the purpose of the load fetch group for the field that's accessed (after the id field).

I haven't checked to see whether this behavior is simply a fantasy of mine or whether the behavior changed over time.

Craig

Craig L Russell
Architect, Oracle
http://db.apache.org/jdo
408 276-5638 mailto:[email protected]
P.S. A good JDO? O, Gasp!

Reply via email to