Вопрос о сгенерированных запросах Hibernate в 3 ситуации - PullRequest
0 голосов
/ 08 мая 2020

Я хочу изучить отношения между таблицами и встретил вопрос о сохранении данных.

Я создал 2 объекта: User и Dog. Предположим, что это одностороннее отношение многие-к-одному, у одного пользователя может быть много собак, у одной собаки может быть только один пользователь.

В классе DogEntity:

    @ManyToOne                   
    @JoinColumn(name = "user_id")
    private UserEntity user;     

И никаких частных в классе UserEntity.

При тестировании, как показано ниже:


    @Test
    public void saveManyFirst(){
        UserEntity user1 = new UserEntity("user2@qq.com", "123qwe",
                "zhangsan2",null,
                null,null,
                null);
        DogEntity dog1 = new DogEntity("Sakura","Akita",null,user1);
        DogEntity dog2 = new DogEntity("Sakura2","Akita2",null,user1);

        dogDao.save(dog1);
        dogDao.save(dog2);
        userDao.save(user1);
    }

Разумно получить ошибку, поскольку «объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом».

Затем я добавил @Transactional, как показано ниже:

    @Test
    @Transactional
    public void saveManyFirst(){
        UserEntity user1 = new UserEntity("user2@qq.com", "123qwe",
                "zhangsan2",null,
                null,null,
                null);
        DogEntity dog1 = new DogEntity("Sakura","Akita",null,user1);
        DogEntity dog2 = new DogEntity("Sakura2","Akita2",null,user1);

        dogDao.save(dog1);
        dogDao.save(dog2);
        userDao.save(user1);
    }

У меня есть три вставки и таблица собаки , таблица пользователя . FK в таблице Dog равны нулю.

Затем я добавил @Rollback (false) (значение по умолчанию истинно).

    @Test
    @Transactional
    @Rollback(false)
    public void saveManyFirst(){
        UserEntity user1 = new UserEntity("user2@qq.com", "123qwe",
                "zhangsan2",null,
                null,null,
                null);
        DogEntity dog1 = new DogEntity("Sakura","Akita",null,user1);
        DogEntity dog2 = new DogEntity("Sakura2","Akita2",null,user1);

        dogDao.save(dog1);
        dogDao.save(dog2);
        userDao.save(user1);
    }

Я получил 3 вставки и еще 2 обновления, и FK в таблице Dog обновляются по желанию. таблица собаки

Конечно, я знаю, что мне лучше сначала спасти того, у кого есть FK, но я изучаю Spring Data Jpa, я действительно хочу знать, почему это произошло. Не могли бы вы мне помочь? Заранее спасибо.

1 Ответ

0 голосов
/ 09 мая 2020

Когда у вас есть одна транзакция, охватывающая все операции, потому что в конце транзакции она видит, что Dog ссылается на пользователя, который уже является тем, что JPA вызывает управляемый .

Когда вы нет транзакции, Spring-Data JPA создает транзакцию для каждого вызова, т.е. каждый вызов для сохранения. Итак, у вас есть 3 транзакции. Теперь первая транзакция, когда она собирается совершить, пытается заразить sh и видит, что у собаки нет управляемой ссылки пользователя, а временной, поэтому вы получаете сообщение об ошибке.

Обратите внимание, что грипп sh также может быть вызван при загрузке / запросе, поэтому важно, чтобы вы либо использовали правильные каскады в своих ассоциациях, либо удостоверились, что промывание происходит в соответствующем порядке.

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