gpt4 book ai didi

java - Spring数据JDBC : Required identifier property not found for a MappedCollection

转载 作者:行者123 更新时间:2023-12-02 08:55:43 29 4
gpt4 key购买 nike

class Game(
@MappedCollection(idColumn = "game") <---- unnecessary
var rules: List<Rule> = emptyList(),
){
@Id
var id: Long? = null
}

data class Rule(
@MappedCollection(idColumn = "rule", keyColumn = "rule_key")<---- unnecessary
val ruleValues: List<RuleValue>
)

data class RuleValue(val value: String)

架构是

create table game
(
id serial primary key
);

create table rule
(
id serial primary key,
game long references game (id),
game_key integer
);

create table rule_value
(
id serial primary key,
game long references game (id),
game_key integer,
rule long references rule (id),
rule_key integer,
value varchar(256)
);

简而言之,我有一个 Game 作为根聚合。 游戏有一个规则列表(顺序很重要),规则有一个规则值列表(顺序很重要) 规则值目前只是一个字符串,但将来可能会扩展。

我有 2 个问题:

1) 未找到所需的标识符属性:当我尝试保存游戏时,我得到 Caused by: java.lang.IllegalStateException: 未找到类 com 所需的标识符属性...规则值!
异常消息。

2) java.sql.SQLSyntaxErrorException:为什么我需要 rule_value 中的 gamegame_key 列 table ?如果我不放置它们,我会得到 Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'game_key' in 'field list'

我正在使用 Spring Boot 版本 2.2.5.RELEASE 和 org.springframework.boot:spring-boot-starter-data-jdbc 对应于 spring-data-jdbc 版本1.1.5.RELEASE

<小时/>

解决方案1:将 ID 字段添加到类中

正如 @chrylis-onstrike- 建议的那样,我在所有数据类中添加了 @Id 字段

class Game(
@MappedCollection(idColumn = "game")
var rules: List<Rule> = emptyList(),
){
@Id
var id: Long? = null
}

data class Rule(
@MappedCollection(idColumn = "rule", keyColumn = "rule_key")
val ruleValues: List<RuleValue>
) {
@Id
var id: Long? = null <---- this is new
}

data class RuleValue(val value: String) {
@Id
var id: Long? = null <---- this is new
}

架构更改为

create table game
(
id serial primary key
);

create table rule
(
id serial primary key,
game long references game (id),
game_key integer
);

create table rule_value
(
id serial primary key,
# game long references game (id), <---- removed this
# game_key integer, <---- removed this
rule long references rule (id),
rule_key integer,
value varchar(256)
);

<小时/>

解决方案2:将复合主键添加到脚本中

class Game(
@MappedCollection(idColumn = "game")
var rules: List<Rule> = emptyList(),
){
@Id
var id: Long? = null
}

data class Rule(
@MappedCollection(idColumn = "rule", keyColumn = "rule_key")
val ruleValues: List<RuleValue>
)

data class RuleValue(val value: String)

架构更改为

create table game
(
id serial primary key
);

create table rule
(
# id serial primary key, <---- removed
game integer,
game_key integer,
primary key (game, game_key) <---- added
);

create table rule_value
(
# id serial primary key, <---- removed
game integer, <---- added
game_key integer, <---- added
rule_key integer,
value varchar(2048),
primary key (game, game_key, rule_key) <---- added
);

<小时/>

结论您需要确定您的对象是值对象还是实体。值对象在类中可能不应该有 id 字段,因为它的标识是由它携带的值定义的。但是,您需要识别数据库表中的一行并将其与其所有者相关联,因此如果您想将它们保留在不同的表上,则需要在值对象中创建复合主键。

最佳答案

  1. 未找到所需的标识符属性。

    我同意@chrylis-onstrike - 该错误告诉您添加带有@Id注释的字段。但我也同意你的观点:情况不应该如此。我至少需要完整的堆栈跟踪才能了解发生了什么。如果有复制器就更好了。欢迎在 https://jira.spring.io/browse/DATAJDBC 上创建问题

    对所提供的重现器的进一步调查表明,问题是由 id 列仍然存在于数据库中并且是 identity 列引起的。因此,在插入后 JDBC 确实返回一个值,并且 Spring Data JDBC 尝试将其设置为实体上的 id,然后由于问题中提到的异常而无法设置该 id。

  2. 为什么我需要 rule_value 表中的 game 和 game_key 列?

    只要 Rule 没有专用 id,其主键就是 gamegame_key 的组合,因此引用来自 rule_value 后面由这两个字段组成。

    Rule 有 ID 时,它们不应该是必需的。

关于java - Spring数据JDBC : Required identifier property not found for a MappedCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495551/

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