gpt4 book ai didi

java - key column 和 map-key 都是 PK

转载 作者:搜寻专家 更新时间:2023-11-01 03:05:35 24 4
gpt4 key购买 nike

如何创建同时具有键列和映射键的映射属性作为详细信息类的 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”等的不同组合。我承认我没有完全理解它是如何工作的。我收到不同的错误消息,例如:

ERROR: null value in "person" column violates NOT NULL constraint
Details: Erroreous row contains (null, null, lastname, ffffirst, null, null).

或:

org.hibernate.MappingException: Repeated column in mapping for entity: PersonName column: person (should be mapped with 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
)

最佳答案

我认为你的映射应该是这样的:

您需要一个嵌套的 Key 类(例如 Person$Key,尽管它也可以是一个外部类)用于嵌入的复合 id:

public static class Key {
private Long personId;
private String code;

public Key(Long personId, String code) {
this.personId = personId;
this.code = code;
}

public Long getPersonId() {
return personId;
}

public String getCode() {
return code;
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof Key)) {
return false;
}
Key k = (Key)obj;
return personId.equals(k.personId) && code.equals(k.code);
}

@Override
public int hashCode() {
return 37*personId.hashCode() + code.hashCode();
}
}

那么你的 map 会是这样的:

private Map<Key,PersonName> names = new HashMap<Key,PersonName>();

Hibernate 映射:

<class entity-name="Person"  >
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="birthDate" type="date"/>
<map name="names" inverse="true">
<composite-map-key class="Person$Key">
<key-property name="personId"/>
<key-property name="code"/>
</composite-map-key>
<one-to-many class="PersonName" />
</map>
</class>

<class entity-name="PersonName">
<composite-id name="id" class="Person">
<key-property name="personId"/>
<key-property name="code"/>
</composite-id>
<many-to-one name="person" class="Person"
insert="false" update="false">
<column name="personId"/>
<column name="code"/>
</many-to-one>
<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>

关于java - key column 和 map-key 都是 PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com