Как преобразовать таблицы в объекты Spring Data? - PullRequest
0 голосов
/ 10 июля 2019

Мне нужна помощь в преобразовании следующих таблиц в Spring Data Entities. Я в некоторой степени смог сделать это, но я не могу понять, как применять ограничения на удаление и обновление. У меня есть таблица пользователей, которая будет содержать информацию о пользователе. Таблица разговоров будет тогда иметь идентификатор разговора и 2 столбца, чтобы представить оба идентификатора участвующих пользователей. Я пишу свое решение на 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>

)

Я пытаюсь обновить первичный ключ в таблице пользователей, но это не позволяет мне из-за ограничения внешнего ключа. Ясно, что Каскад не работает.

1 Ответ

0 голосов
/ 10 июля 2019

В отношениях JPA работают только 1 способом, иначе для удаления Converation при удалении User необходимо иметь отношение @OneToMany к Converation из User.То же самое относится и к обновлению.

Поэтому добавление такого свойства внутри User должно решить вашу проблему:

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

ОБНОВЛЕНИЕ

JPA создает отдельную таблицу, это обычно решается добавлением mappedBy = "mappingFieldName" к @OneToMany, но, учитывая ваш случай, когда у вас есть 2 поля, это немного сложнее и гораздо более обширная проблема.Вам нужно будет либо выполнить множество пользовательских запросов, либо просто сохранить дубликаты записей, что означает, что для каждого нового разговора у вас фактически будет 2 из них, поэтому вы можете сказать mappedBy = "user1", просто не забывайте каждый раз сохранять 2 разговора, 1где user1 - фактический user1, а другой - где вы меняете user1 и user2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...