Использование каскада OneToOne с собственным дочерним хранилищем - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть следующий родительский объект:

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "email", unique = true)
    private String email;
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    private Address address;
}

И следующий дочерний объект:

public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "address")
    private final String address;
}

Для дочернего объекта у меня есть собственный репозиторий, расширяющий дефолтный. Вот реализация:

@Override
    public <S extends Address> S save(S address) {
        //Some important additional logic here, lets say it will be log:
        log.info("The problem is that this message does not appear when I create a user entity!");

        //And perform a simple save operation
        if (entityInformation.isNew(address)) {
            entityManager.persist(address);
            return address;
        } else {
            return entityManager.merge(address);
        }
    }

Когда я создаю пользователя, он каскадно создает связанный адрес. НО при этом он использует метод сохранения по умолчанию из хранилища адресов по умолчанию, а не мой переопределенный метод. Поэтому он пропускает важный лог c для сохранения адреса. Как мне сделать так, чтобы использовать переопределенный метод?

Вот как я создаю пользователя:

User user = new User();
user.setEmail("test@test.test");
user.setAddress(new Address("My address"));
userRepo.save(user);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...