Jpa OneToOne поделился первичным ключом половина работ - PullRequest
1 голос
/ 12 марта 2019

У меня есть приложение SpringBoot 2.1.3 и Java 8. Построение БД с JPA У меня есть 3 таблицы в отношениях один к одному. Предположим, что таблицы следующие:

@Entity
@Data //lombok
@Table(name = "users")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Long id;

  @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
  private Address address;
}

А потом:

@Entity
@Data
@Table(name = "address")
public class Address {
  @Id
  @Column(name = "id")
  private Long id;

  @OneToOne
  @MapsId
  private User user;
}

Это работает .. и это лучший способ (именно этот пример взят из документации).

Если я запускаю приложение, создается БД, и если я пытался добавить сущности, все работает хорошо. Созданная модель выглядит следующим образом:

Thw two table with onetoone relationships

Теперь я хочу добавить объект Country в мой адрес Entities (например), и я изменил Entities следующим образом:

@Entity
@Data
@Table(name = "address")
public class Address {
 @Id
 @Column(name = "id")
 private Long id;

 @OneToOne
 @MapsId
 private User user;

 @OneToOne
 @MapsId
 private Country country;
}

И страны:

@Entity
@Data 
@Table(name = "country")
public class Country {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Long id;

  @OneToOne(mappedBy = "country", cascade = CascadeType.ALL)
  private Address address;
}

Приложение все еще запускается, БД создается и модель выглядит следующим образом:

final model

Но если я попытаюсь сохранить пользователя следующим образом:

User user = new User();
Address address = new Address();
Country country = new Country();

user.setAddress(address);
address.setUser(user);

address.setCountry(country);
country.setAddress(address);

userRepository.save(user);

Я получаю ошибку:

java.sql.SQLException: Field 'country_id' doesn't have a default value

В любом случае, я решаю проблему, удалив @MapsId и добавив @JoinColumn, но я бы хотел понять, в чем дело.

P.S .: Я использую MySQL 5.7 с диалектом InnoDB (настройка в application.properties)

Спасибо всем

1 Ответ

0 голосов
/ 12 марта 2019

Работает только с одной @ MapsId аннотацией. Использование двух приводит к тому, что идентификатор страны не вставляется:

insert into Country (id) values (?)
insert into Users (id) values (?)
insert into Address (user_id) values (?) 
...