【发布时间】:2019-11-20 07:59:25
【问题描述】:
我正在寻求将下表转换为 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 无法正常工作。
【问题讨论】:
-
Intellij 有一个工具。转到持久性选项卡,您可以从表中创建实体类。但是你必须自己添加你的外键
-
Hrrmm 我知道一些 JPA 提供程序(例如 Hibernate)不允许您更改主键
标签: java spring-boot kotlin spring-data-jpa spring-data