Describe BeanManagedPersistence here: SQL CRUD is hard coded into a BMP entity bean (as opposed to using a deployment descriptor)
"Even to access an entity by its primary key, you have to go twice to the database."
Unless you add the ejbLoad() I do not think you have to go twice to the database:
public String ejbFindByPrimaryKey(String primaryKey) throws FinderException? {
boolean haveResult = false; //... String query = "select id from CUSTOMER where id = ? "; PreparedStatement prepStatement = connection.prepareStatement(query); prepStatement.setString(1, primaryKey); haveResult = prepStatement.execute(); //... if (! haveResult) { throw new ObjectNotFoundException?("No record found for Customer id: " + primaryKey ); } return primaryKey;The ejbLoad() call might be considered Lazy Initialization.
Unless ejbLoad() is called you don't have access to the Entity Bean by definition. So ejbLoad() will be called in 99% of the cases following the ejbFindByPrimaryKey(). Why do you think clients call ejbFindByPrimaryKey(), just to discard the resulting reference?
The N+1 hits was pretty silly - I cant defend that one.
Dave Hunter