Java JPA: NULL в столбце @JoinColumn

232
20 июля 2021, 04:40

У меня есть две JPA-сущности, связанные один-к-одному:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person extends IdentifiableObject {
    private String firstName;
    private String lastName;
    private int age;
    private LocalDate birthday;
    @OneToOne(optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name = "passport_id")
    private Passport passport;
}

@Entity
@Data
public class Passport extends IdentifiableObject {
    private String series;
    private String number;
    private LocalDate issueDate;
    private Period validity;
    @OneToOne(optional = false, mappedBy = "passport")
    private Person owner;
}

Они наследуются от общего класса:

@MappedSuperclass
@ToString
@Data
public abstract class IdentifiableObject {
    @Id
    @GeneratedValue
    private Long id;
}

Я хочу сохранить их в базе H2 таким образом:

@Override
    public void run(String... args) throws Exception {
        Person person = new Person();
        person.setAge(43);
        person.setBirthday(LocalDate.now());
        person.setFirstName("Hovard");
        person.setLastName("Lovecraft");
        Passport passport = new Passport();
        passport.setSeries("1234");
        passport.setNumber("456789");
        passport.setOwner(person);
        personRepository.save(person);
    }

Но почему-то во время выполнения я получаю ошибку: Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: �������� NULL �� ��������� ��� ���� "PASSPORT_ID"

Что в этом коде не так? Что это за ошибка? Почему она произошла и как ее исправить?

Дополнение: при сохранение person не сохраняется в таблице passport. Почему так? Здесь Person владелец связи, поэтому при сохранении person должен сохраниться и passport.

READ ALSO
Перечисления в книге (пример)

Перечисления в книге (пример)

Не очень понял, как так можно писать?

262
ThreadLocalRandom, генерация nextDouble(double, double)

ThreadLocalRandom, генерация nextDouble(double, double)

Всем доброго времени сутокВопрос заключается в следующем: почему при объявлении в классе

204
Как работает Scanner.tokens()

Как работает Scanner.tokens()

В документации к класу Scanner написано, что tokens() возвращает стрим стрингов, таких же которые возвращал бы метод next()

196
Оператор break для switch case внутри lambda-выражения

Оператор break для switch case внутри lambda-выражения

Прошу подсказать, как можно обыграть такую ситуацию с break:

177