【发布时间】:2014-07-24 04:03:18
【问题描述】:
如何创建一个同时具有键列和映射键作为详细信息类 PK 的一部分的映射属性?
像这样:
<class entity-name="Person" >
<id name="id"/>
<property name="birthDate" type="date"/>
<map name="names">
<key column="personId"/>
<map-key type="string" column="code"/>
<one-to-many class="PersonName" />
</map>
</class>
<class entity-name="PersonName">
<composite-id>
<key-many-to-one name="personId" class="Person"/>
<key-property name="code" type="string" length="32"/>
</composite-id>
<property name="lastName" type="string" length="64" index="nameSearch"/>
<property name="firstName" type="string" length="64" index="nameSearch"/>
<property name="middleName" type="string" length="64" index="nameSearch"/>
<property name="isActual" type="boolean"/>
</class>
我需要避免在 PersonName 类中创建需要特殊处理的代理键。下面显示的 Json 应该会自动持久化到数据库中,在必要时根据 PersonId-code 键插入和更新详细记录。
“代码”属性很自然地与人员 ID 一起标识行。
我尝试了“inverse”、“not-null”等的不同组合。我承认我没有完全理解它是如何工作的。我收到不同的错误消息,例如:
错误:“person”列中的空值违反了 NOT NULL 约束
详细信息:错误行包含(null、null、lastname、ffffirst、null、null)。
或:
org.hibernate.MappingException:实体映射中的重复列: PersonName 列:人(应使用 insert="false" update="false" 映射)
如果表示为 json,应该是这样的:
{
"birthDate": "33-44-55",
"names": {
"mainName": {
"lastName": "lastname",
"firstName": "ffffirst"
},
"maidenName": {
"lastName": "lastname1",
"firstName": "ffffirst2"
},
"old": {
"lastName": "lastname3",
"firstName": "ffffirst4"
}
}
}
UPD(澄清问题) 实际上这是一个主要目标 - 使用此 json 发布时,系统应该创建主文件和所有详细信息。这个 json 被转换成映射的类。如果 master 填充了“id”,系统应该更新 master 和 details,并在需要时添加新条目。详细信息(“名称”映射条目)不应指定任何代理“id”。它们由master的“personId”字段和“code”字段标识。
** 说明 2 ** 如示例 json 所示,映射键是字符串,而不是复合键。从映射 xml 中可以看出,这都是动态映射。不应编写无法从 json 自动实例化的其他类。
希望有可能!
获取全图,表格生成OK,我喜欢:
CREATE TABLE personname
(
personid character varying(32) NOT NULL,
code character varying(32) NOT NULL,
lastname character varying(64),
firstname character varying(64),
middlename character varying(64),
isactual boolean,
CONSTRAINT personname_pkey PRIMARY KEY (personid, code),
CONSTRAINT fk_1skg5frawyftx8co9uawhc3r8 FOREIGN KEY (personid)
REFERENCES person (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
【问题讨论】:
-
亲爱的,我会接受hibernate无法帮助我实现我想要的答案。它有很多特性,包括指定映射键的能力,但是这个特性并不意味着在细节表中它会被限制为一个映射键有多个条目。地图键只是装饰意义
标签: java hibernate jpa orm hibernate-mapping