создание таблицы отношений при запуске MySQL Spring Boot из data.sql - PullRequest
0 голосов
/ 04 мая 2019

Здравствуйте, у меня есть задача создать приложение с использованием весенней загрузки и гибернации.Дело в том, что я создаю базу данных через файл data.sql, чтобы сохранить данные и создать базу данных.Теперь мне нужно создать таблицу отношений между моими двумя таблицами.Это должно быть отношение один ко многим, учитывая, что работник может иметь учетную запись пользователя или может не иметь учетной записи.Проблема заключается в том, как создать эту таблицу отношений при запуске приложения, поскольку ссылки должны быть внешними ключами user_id и worker_id , которых у меня нет при запуске, поскольку они создаются автоматическив спящем режиме, так что нет способа жестко их закодировать.Таким образом, вопрос заключается в том, как бы я мог создать эту таблицу отношений из data.sql.

data.sql:

INSERT INTO worker (name, last_name, status) VALUES
('manuel', 'dias', 'active'),
('sailin ', 'nal', 'active'),
('abraham', 'lincon', 'active'),
('mick', 'smith', 'active'),
('jose', 'perez', 'inactive'),
('luis', 'nuñez', 'inactive'),
('ruben', 'puertas', 'inactive'),
('anders', 'stone', 'inactive'),
('luis', 'alvarez', 'deleted'),
('claudio', 'martinez', 'deleted'),
('morfeo', 'rodriguez', 'active'),
('onetys', 'estrada', 'inactive'),
('rene', 'fajardo', 'active');

INSERT INTO users (username, password, user_type, status) VALUES
('madi', 'madi', 'worker', 'active'),
('sana', 'sana', 'worker', 'active'),
('abli', 'abli', 'worker', 'active'),
('mism', 'mism', 'worker', 'active'),
('jope', 'jope', 'worker', 'active'),
('lunu', 'lunu', 'worker', 'active'),
('rupu', 'rupu', 'worker', 'active'),
('anst', 'anst', 'worker', 'active'),
('lual', 'lual', 'worker', 'active'),
('clma', 'clma', 'worker', 'active');

Users.class:

@Entity
@Table(name = "users")
public class Users implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id", nullable = false)
    private int userId;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Column(name = "userType")
    private String userType;
    @Column(name = "status")
    private String status;


    @ManyToOne
    @JoinColumn(name = "worker_id")
    private Worker worker;

Worker.class:

@Entity
@Table(name = "worker")
public class Worker implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "worker_id")
    private int workerId;
    @Column(name = "name")
    private String name;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "status")
    private String status;

    @OneToMany(mappedBy = "worker", cascade = CascadeType.ALL)
    private Collection<Users> users;

Так что мне нужно:

1: Создать другую сущность, чтобы иметь возможность создать новую таблицу в базе данных, содержащую внешние ключи для пользователей и рабочих сущностей?

2: Можно ли это сделать с помощью скрипта в data.sql.

Я бы создал столбец в таблице пользователей, ссылающийся на идентификатор работника, но задача явно говорит:

"создайте третий стол, чтобы сохранить отношения"

Заранее спасибо

1 Ответ

2 голосов
/ 04 мая 2019

В отношениях OneToMany вы можете получить всю необходимую информацию о сущности многих сторон.Создание другой таблицы присоединения имеет смысл только для отношений ManyToMany, это только добавит избыточные данные в OneToMany и нарушит нормализацию .

При этом, если вам действительно нужна другая таблица для определения двух сущностейотношения, вы можете достичь этого без создания другой сущности, используя @JoinTable.

@Entity
@Table(name = "users")
public class Users implements Serializable {
    //....
    @ManyToOne
    @JoinTable(name = "worker_users",
                joinColumns =  @JoinColumn(name = "user_id"),
                inverseJoinColumns = @JoinColumn(name = "worker_id"))
    private Worker worker;
}


@Entity
@Table(name = "worker")
public class Worker implements Serializable {
    //...
    @OneToMany(cascade = CascadeType.ALL) //remove mappedBy
    @JoinTable(name = "worker_users",
                joinColumns =  @JoinColumn(name = "worker_id"),
                inverseJoinColumns = @JoinColumn(name = "user_id"))
    private Collection<Users> users;
}

Это создаст новую таблицу worker_user с этой структурой

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