Автоматическое обновление баз создает однонаправленное соединение на неправильной стороне - PullRequest
0 голосов
/ 17 октября 2018

Проблема заключается в том, что при запуске приложения hibernate создает столбец user_id в таблице tahograph_cards, который мне не нужен, и не создает столбец tahograph_card_id в таблице пользователей, которую я хочу.Это отношения OneToMany.

Вот мои файлы:

application.properties:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/getmydrivercard
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update

Пользователь:

package com.getmydrivercard.getmydrivercard.models;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Entity
@Table(name = "users")
public class User {
    private static final String EMPTY_STRING = "";

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID userId;

    @NotEmpty
    private String username;

    @NotEmpty
    private String password;

    @NotEmpty
    private String email;


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private Set<TahographCard> tahographCards;

    private String comments;

    protected User(){}

    public User(String username, String password, String email){
        setUsername(username);
        setPassword(password);
        setEmail(email);
        setComments(EMPTY_STRING);
        setTahographCards();
    }

   //getters and setters
}

TahographCard:

package com.getmydrivercard.getmydrivercard.models;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import java.util.UUID;

@Entity
@Table(name = "tahograph_cards")
public class TahographCard {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID tahographCardId;

    @NotEmpty
    private Boolean isActive;

    @NotEmpty
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "userId")
    private User user;

    protected TahographCard(){}

    public TahographCard(User user){
        setUser(user);
        setActive(true);
    }
    //getters and setters
  }

Я попробовал с mappedBy и некоторыми другими вещами, которые я нашел в Интернете, но все еще не работает.Заранее спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Проблема здесь не в конфигурации сущностей, а в дизайне базы данных.Вы не можете отобразить отношение oneToMany со столбцом FK на одной стороне.

Например, если у вас 2 пользователя и 4 TahographCard (по 2 на каждого пользователя), обычно это будет выглядеть так:

User
id name
1  Foo
2  Bar

Table
id user_id (fk)
1  1
2  1
2  2
2  2

Обратное с TahographCardId на пользовательской таблице невозможно

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