gpt4 book ai didi

java - 如何将表转换为Spring Data实体?

转载 作者:行者123 更新时间:2023-12-02 03:14:06 25 4
gpt4 key购买 nike

我正在寻求一些帮助来将下表转换为 Spring 数据实体。我在某种程度上能够做到这一点,但我无法弄清楚强制执行删除和更新约束。我有一个用户表,其中包含有关用户的信息。然后,对话表将有一个对话 ID 和 2 列来表示参与用户的两个 ID。我正在用 Kotlin 编写解决方案,但我也很乐意接受 Java 中的建议。使用 Postgres。归根结底,我只想得到这两个表,并且能够更改用户表中的主键并将其转移到对话表中。

CREATE TABLE users (
id uuid PRIMARY KEY,
bio character varying(255),
first_name character varying(255) NOT NULL,
last_name character varying(255) NOT NULL,
password character varying(255) NOT NULL,
username character varying(255) NOT NULL UNIQUE,
zip_code character varying(255) NOT NULL
);

CREATE TABLE conversations (
convoid BIGSERIAL PRIMARY KEY,
user_id1 uuid REFERENCES users(id) on delete cascade on update cascade,
user_id2 uuid REFERENCES users(id) on delete cascade on update cascade
);

这是我尝试过的:

@Data
@NoArgsConstructor
@Entity
@Table(name = "users")
data class User(

@Id //primary key
var id: UUID = UUID.randomUUID(),

@Column(nullable = false)
var firstName: String,

@Column(nullable = false)
var lastName: String,

@Column(nullable = false, unique = true)
var username: String,

@Column(nullable = false)
var password: String,

@Transient
var confirmPassword: String,

@Column(nullable = false)
var zipCode: String,

@Column(nullable=true)
var bio: String?

)

@Data
@NoArgsConstructor
@Entity
@Table(name = "conversations")
data class Conversation(

@Id //primary key
@GeneratedValue(strategy = GenerationType.IDENTITY)
val convoID: Long,

@ManyToOne(cascade = [CascadeType.ALL])
@JoinColumn(name = "user_id1")
val user1: User, //FK of user table PK

@ManyToOne(cascade = [CascadeType.ALL])
@JoinColumn(name = "user_id2")
val user2: User, //FK of user table PK

@Transient
var participants: List<WebSocketSession>

)

我正在尝试更新用户表中的主键,但由于外键约束,它不允许我更新。显然 Cascade 不起作用。

最佳答案

在 JPA 关系中只能以一种方式工作,在其他情况下,要在删除 User 时删除 Converation,您需要具有 @OneToMany 关系来自用户对话。同样的事情也适用于更新。

因此在 User 中添加这样的属性应该可以解决您的问题:

@OneToMany(cascade = CascadeType.ALL)
val conversations: List<Conversation>

更新

JPA 创建单独的表,通常通过将 mappedBy = "mappingFieldName" 添加到 @OneToMany 来解决,但考虑到您有 2 个字段的情况,这有点棘手且更广泛的问题。您要么必须执行大量自定义查询,要么只是保留重复的条目,这意味着对于每个新的对话,您实际上都会有 2 个条目,因此您可以说 mappedBy = "user1",只需请记住每次保存 2 个对话,其中一个是 user1 是实际的 user1,另一个是交换 user1 和 user2。

关于java - 如何将表转换为Spring Data实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56974972/

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