Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Hibernate为用户实现EAV模式->;设置关系_Hibernate_Spring Mvc_Entity Attribute Value - Fatal编程技术网

使用Hibernate为用户实现EAV模式->;设置关系

使用Hibernate为用户实现EAV模式->;设置关系,hibernate,spring-mvc,entity-attribute-value,Hibernate,Spring Mvc,Entity Attribute Value,我正在尝试使用Java/SpringMVC和Hibernate在我的web应用程序中设置一个简单的EAV模式。我似乎无法理解这个场景中HibernateXML设置背后的魔力 我的数据库表“SETUP”有三列: 用户id(FK) 设置项目 设置值 数据库复合键由用户id |设置项目 下面是Setup.java类: public class Setup implements CommonFormElements, Serializable { private Map data = new H

我正在尝试使用Java/SpringMVC和Hibernate在我的web应用程序中设置一个简单的EAV模式。我似乎无法理解这个场景中HibernateXML设置背后的魔力

我的数据库表“SETUP”有三列:

  • 用户id(FK)
  • 设置项目
  • 设置值
数据库复合键由用户id |设置项目

下面是Setup.java类:

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;
  }
}
我在Hibernate设置中遇到的问题是,我似乎不知道如何映射出一个事实,即外键和映射的键将构造表的复合键。。。这是因为缺乏使用Hibernate的经验。以下是我的初步尝试:


真的


任何关于如何正确映射此常见场景的见解都将不胜感激

如您自己所示,您的映射不一致

您说过Setup类定义了一个复合主键(注意,我已经创建了一个复合主键类(SetupId-见下文),它必须实现Serializable和equals以及hashcode方法)

由于您的设置类有一个值类型的映射,因此在定义其关系时,应该定义其复合外键

还有你的数据表

SETUP_ITEM USER_ID
0          1
如果您尝试以下方法,会发生什么

Integer userId = 3;
String setupValue = "someValue";

setup.getData().put(userId, setupValue);
由于设置表未定义值为3的用户ID,您将看到约束冲突

记住这一点

如果您有一个(复合)主键,它不能更新,请避免以某种方式使用它来更改依赖它的可变属性。否则,Hibernate会抱怨它


@特雷弗欢迎,但如果你看到有用的答案,请投票,谢谢!
<class name="ar.domain.Setup">
    <composite-id name="setupId" class="ar.domain.Setup$SetupId">
        <key-property name="setupItem" type="string" column="SETUP_ITEM"/>
        <key-property name="userId" type="integer" column="USER_ID"/>
    </composite-id>
    <many-to-one name="user" class="ar.domain.User" column="USER_ID" insert="false" update="false"/>
    <map name="data" table="DATA_TABLE">
        <key>
            <column name="SETUP_ITEM"/>
            <column name="USER_ID"/>
        </key>
        <map-key column="USER_ID"/>
        <element column="SETUP_VALUE" not-null="true" type="string"/>
    </map>
</class>
SETUP_ITEM USER_ID
0          1
0          2
SETUP_ITEM USER_ID
0          1
Integer userId = 3;
String setupValue = "someValue";

setup.getData().put(userId, setupValue);