复合键和spring-data-jdbc

13

我有一个使用复合键的数据库。是否可以利用spring-data-jdbc?我尝试了里程碑版本1.1M2,其中按照以下方式映射了我的实体:

class History {

   @ID
   @Embedded
   private CompositeHistoryID  id;
}

然后在我的仓库类中,我添加了

HistoryRepository extends Repository<History,CompositeHistoryID  >{
   History  findByhId(CompositeHistoryID  id)
}

我追踪了SQL语句,但是它没有起作用。嵌入式部分可以工作,但where子句不正确。它使用单个参数占位符而不是具有常规复合键结构的元素1 = subkey1和element2 = subkey2等。

我有两个问题。是否有办法使复合ID起作用?

第二个问题是,假设我在findByID上使用自定义的@Query,那么SAVE方法还能起作用吗?如果根本没有ID,如果我只选择一个随机列并说您将成为我的ID,会怎样?


相关链接:https://dev59.com/Uq_la4cB1Zd3GeqPzd_a#j_3qnYgBc1ULPQZF7gz1 - Jens Schauder
2
很遗憾,https://jira.spring.io/browse/DATAJDBC-352 于一年前创建,这样一个基础功能仍未发布。 - ccampo
@ccampo 点赞,希望有一天会被正确的人注意到 :) - Alexander Petrov
2个回答

9

@Embedded 不能用于Ids,目前还不支持。 现在所有的SQL语句都假定ID列有一个简单的值。 我认为目前没有解决办法。

一个可能有效的解决办法是创建一个视图,将组合键呈现为单个字段,并使用触发器将正确的数据写入底层表中。


7
这真的很糟糕,这让Spring Data JDBC在大多数数据库模式下变得无用。 :( - PowerStat
4
@PowerStar,我觉得你有点夸张了 :) 但如果你有遗留数据库或自然键,确实会很不方便。 - Alexander Petrov
2
因此,使用spring-jdbc处理这些表的唯一方法是向使用的表添加一个合成的简单类型ID列吗? - levant pied

0
对于(希望是少数)需要复合ID的聚合根,您可以始终使用片段存储库来提供自己的实现,可以通过覆盖(List)CrudRepository中的相关方法,或者只是使用Repository。(您仍然可以创建类似于findAllByLastname的查询)。
一个实际的解决方法是在Set/Map中对其进行建模,这样,在与聚合根相关的表(或更深层次的表)的数据库模式中可以有复合主键。可以直接基于复合主键查询这个表,并且可能还可以创建插入操作。 在我实际应用中,我创建了一个包含仅Set(实际上是Map)的可嵌入包装对象,只是为了提供一个与此相关的接口。
import java.util.*

data class Userdata(
    @Id val id: UUID,
    val keyValueStore: Set<UserdataKeyValue> 
)

data class UserdataKeyValue(
    val key: String,
    val value: String
)

CREATE TABLE USERDATA_KEY_VALUE
(         
    userdata uuid not null,
    key varchar(30) not null,
    value varchar(255)
);

ALTER TABLE USERDATA_KEY_VALUE
  ADD CONSTRAINT pk_KEY_VALUE_TO_USERDATA
    PRIMARY KEY (userdata, key);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接