Implementing EAV pattern with Hibernate for User -> Settings relationship
- by Trevor
I'm trying to setup a simple EAV pattern in my web app using Java/Spring MVC and Hibernate.  I can't seem to figure out the magic behind the hibernate XML setup for this scenario.
My database table "SETUP" has three columns:
user_id (FK)
setup_item
setup_value
The database composite key is made up of user_id | setup_item
Here's the Setup.java class:
public class Setup implements CommonFormElements, Serializable {
  private Map data = new HashMap();
  private String saveAction;
  private Integer speciesNamingList;
  private User user;
  Logger log = LoggerFactory.getLogger(Setup.class);
  public String getSaveAction() {
    return saveAction;
  }
  public void setSaveAction(String action) {
    this.saveAction = action;
  }
  public User getUser() {
    return user;
  }
  public void setUser(User user) {
    this.user = user;
  }
  public Integer getSpeciesNamingList() {
    return speciesNamingList;
  }
  public void setSpeciesNamingList(Integer speciesNamingList) {
    this.speciesNamingList = speciesNamingList;
  }
  public Map getData() {
    return data;
  }
  public void setData(Map data) {
    this.data = data;
  }
}
My problem with the Hibernate setup, is that I can't seem to figure out how to map out the fact that a foreign key and the key of a map will construct the composite key of the table... this is due to a lack of experience using Hibernate.  Here's my initial attempt at getting this to work:
  
<composite-id>
  <key-many-to-one foreign-key="id" name="user" column="user_id" class="Business.User">
    <meta attribute="use-in-equals">true</meta>
  </key-many-to-one>
</composite-id>
<map lazy="false" name="data" table="setup">
  <key column="user_id" property-ref="user"/>
  <composite-map-key class="Command.Setup">
    <key-property name="data" column="setup_item" type="string"/>
  </composite-map-key>
  <element column="setup_value" not-null="true" type="string"/>
</map>
Any insight into how to properly map this common scenario would be most appreciated!