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

时间:2019-07-10 16:26:32

标签: java spring-boot kotlin spring-data-jpa spring-data

我正在寻找一些帮助,将下表转换为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>

)

我正在尝试更新用户表中的主键,但是由于外键约束,不允许这样做。显然,级联不起作用。

1 个答案:

答案 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。