My application will upon request retrieve information from a database and produce an object from that information. I’m currently considering two different techniques (but I’m open to others as well!) to complete this task:
Method one:
class Book {
private int id;
private String author;
private String title;
public Book(int id) {
ResultSet book = getBookFromDatabaseById(id);
this.id = book.id;
this.author = book.author;
// ...
}
}
Method two:
public class Book {
private HashMap<String, Object> propertyContainer;
public Book(int id) {
this.propertyContainer = getBookFromDatabaseById(id);
}
public Object getProperty(String propertyKey) {
return this.propertyContainer.get(propertyKey);
}
}
With method one, I believe that it’s easier to control, limit and possibly access properties, adding new properties, however, becomes smoother with method two.
What’s the proper way to do this?
I think this problem has been solved in many ways: ORM, DAO, row and table mapper, lots of others. There’s no need to redo it again.
One issue you have to think hard about is coupling and cyclic dependencies between packages. You might think you’re doing something clever by telling a model object how to persist itself, but one consequence of this design choice is coupling between model objects and the persistence tier. You can’t use model objects without persistence if you do this. They really become one big, unwieldy package. There’s no layering.
Another choice is to have model objects remain oblivious to whether or not they’re persisted. It’s a one way dependence that way: persistence knows about model objects, but not the other way around.
Google for those other solutions. There’s no need to beat that dead horse again.