Have you seen ActiveObjects? It's an incubating ORM layer over at dev.java.net; it's got some neat stuff in it.

https://activeobjects.dev.java.net/basic-concepts.html

I'm especially drawn to the idea that a bean could be defined as an interface, rather than as a concrete implementation. It saves me from having to actually define the implementation of getters and setters, while still preserving type-safety (and auto-completion in my IDE).

  interface Employee {
    public String getName();
    public void setName(String name);
  }

It's easy to use java.lang.reflect.Proxy to automatically generate simple implementations for bean-like interfaces. The InvocationHandler could just keep a DynaBean internally that maps properties to values; when a getter is called, we'd just call an appropriate getter on the DynaBean; when a setter is called, we'd just call an appropriate setter on the DynaBean.

  Employee e = instantiateBeanInterface(Employee.class);

The result would be something like a type-safe DynaBean, which intrigues me.

We could go even further. Perhaps if the interface bean (IBean?) implemented other tagging interfaces, we could add in additional functionality.

For example, BeanUtils could define an interface like this:

  interface DirtyManagedBean {
    public PropertyDescriptor[] dirtyProperties();
    public boolean isDirty(String propertyName);
    public void clean(String propertyName);
    public void cleanAll();
  }

Then, I could make my Employee interface implement DirtyManaged, and have the automatically generated bean keep track of which properties were dirty (had been modified) and which were clean.

We could also have an interface like this:

  interface SupportsPropertyChange {
    public java.beans.PropertyChangeSupport propertyChangeSupport();
  }

If my Employee implemented SupportsPropertyChange, I could retrieve its associated PropertyChangeSupport object and attach change listeners; we'd guarantee that the generated bean would fire change events via the support object.

FOR DATABASES

Specifically, I'm imagining IBeans would be helpful in the world of SQL databases, outside of any ORM layer.

1) You could automatically INSERT/UPDATE a DirtyManaged bean, adding only explicitly dirty columns to the SQL statement.

2) In general, an IBean could wrap around a PreparedStatement:

  PreparedStatement ps = prepareStatement();
  Employee e = proxyPreparedStatement(Employee.class, ps, columnList);
  employee.setFirstName("Dan");
  employee.setLastName("Fabulich");
  ps.addBatch();
  employee.setFirstName("Somebody");
  employee.setLastName("Else");
  ps.addBatch();
  ps.executeBatch();

3) An IBean could wrap around a ResultSet; when you call .next() on the result set, the IBeans getters/setters could return the new values, eliminating the need to create N objects for N rows.

  Employee employee = proxyResultSet(Employee.class, resultSet);
  while (resultSet.next()) {
    System.out.println("Name: " + employee.getName());
    System.out.println("Address: " + employee.getAddress());
  }

3) If you're doing a join, you could define a new bean that wrapped around the joined query via multiple inheritance.

  interface EmployeeAddressQuery implements Employee, Address;

  Statement s = c.createStatement("SELECT * from employees, addresses");
  resultSet = s.executeQuery();
  Employee employee = proxyResultSet(Employee.class, resultSet);
  while (resultSet.next()) {
    System.out.println("Name: " + employee.getName());
    System.out.println("Street Name: " + employee.getStreet());
  }

Thoughts?

-Dan

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to