我正在寻找一些帮助,将下表转换为Spring数据实体。我可以做到这一点,但我不知道强制执行on删除和update约束。我有一个用户表,其中将包含有关用户的信息。然后,会话表将具有一个会话ID和2列,分别代表参与用户的ID。我正在用Kotlin编写我的解决方案,但是我也很好用Java的建议。使用Postgres。归根结底,我只想结束这两个表,就可以更改users表中的主键并将其保留到对话表中。
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>
)
我正在尝试更新用户表中的主键,但是由于外键约束,不允许这样做。显然,级联不起作用。
答案 0 :(得分:0)
在JPA关系中,只能以一种方式工作,否则,在删除Converation
时删除User
时,您需要与{{1 }}。同样的事情也适用于更新。
因此在@OneToMany
内添加这样的属性应该可以解决您的问题:
Converation
更新
JPA创建单独的表,通常可以通过将User
添加到User
来解决,但是考虑到您有2个字段的情况,这有点棘手,而且涉及范围更广。您将不得不做很多自定义查询,或者只是保留重复的条目,这意味着对于每个新会话,您实际上将有2个,因此您可以说@OneToMany(cascade = CascadeType.ALL)
val conversations: List<Conversation>
,只记得每次保存2个会话,其中1(其中user1是实际的user1),另一个则交换了user1和user2。