У меня есть приложение 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;
}
Это работает .. и это лучший способ (именно этот пример взят из документации).
Если я запускаю приложение, создается БД, и если я пытался добавить сущности, все работает хорошо. Созданная модель выглядит следующим образом:
Теперь я хочу добавить объект 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;
}
Приложение все еще запускается, БД создается и модель выглядит следующим образом:
Но если я попытаюсь сохранить пользователя следующим образом:
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)
Спасибо всем