使用Hibernate为用户实现EAV模式->;设置关系
我正在尝试使用Java/SpringMVC和Hibernate在我的web应用程序中设置一个简单的EAV模式。我似乎无法理解这个场景中HibernateXML设置背后的魔力 我的数据库表“SETUP”有三列:使用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
- 用户id(FK)
- 设置项目
- 设置值
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);