Spring jpa repository пытается вставить новую запись для отношения многие ко многим, когда я пытаюсь обновить другое поле - PullRequest
0 голосов
/ 22 марта 2020

У меня есть простой объект, состоящий из одного отношения «один ко многим» и одного отношения «многие ко многим».

У меня есть тестовый сценарий для добавления 2 контактов и 2 ролей к объекту клиента, а затем поиска клиента. получить контакты из него удалить один из контактов и сохранить клиента.

Role adminRole = new Role();
adminRole.setCode("ADMIN");
adminRole.setName("Administration");

Role userRole = new Role();
userRole.setCode("USER");
userRole.setName("General User");

Contact contact = new Contact();
contact.setContactType(ContactType.MOBILE);
contact.setNumber("040404040");

Contact contact2 = new Contact();
contact2.setContactType(ContactType.PHONE);
contact2.setNumber("2348756234");

Customer customer = new Customer();
customer.setFirstName("leo");
customer.setLastName("ryan");
customer.addContact(contact);
customer.addContact(contact2);

customer.addRole(adminRole);
customer.addRole(userRole);

Customer savedCust = customerRepository.save(customer);

assertNotNull(savedCust);

Optional<Customer> optCust = customerRepository.findByFirstName("leo");

assertThat(optCust).isPresent();

Customer cust01 = optCust.get();

Set<Contact> contacts = cust01.getContacts();
MatcherAssert.assertThat(contacts, Matchers.hasSize(2));

log.info("contacts: {}", contacts);

Set<Role> roles = cust01.getRoles();
MatcherAssert.assertThat(roles, Matchers.hasSize(2));

log.info("roles: {}", roles);

Contact contact3 = new Contact();
contact3.setContactType(ContactType.PHONE);
contact3.setNumber("2348756234");

cust01.removeContact(contact3);
customerRepository.save(cust01);

Я думаю, что это должен быть простой тест, и он должен работать. При сохранении клиента я получаю сообщение об ошибке, связанной с повторяющейся записью для таблицы customer_role, которая является промежуточной таблицей, связанной с отношением «многие ко многим» между клиентом и ролью.

Мой вопрос заключается в том, почему jpa даже пытается вставить новый запись для уже существующих записей для отношения "многие ко многим".

Hibernate: выберите next_val в качестве id_val из hibernate_sequence для обновления

Hibernate: обновите hibernate_sequence set next_val =? где next_val =?

Hibernate: выберите next_val в качестве id_val из hibernate_sequence для обновления

Hibernate: обновите hibernate_sequence set next_val =? где next_val =?

Hibernate: выберите next_val в качестве id_val из hibernate_sequence для обновления

Hibernate: обновите hibernate_sequence set next_val =? где next_val =?

Hibernate: выберите next_val в качестве id_val из hibernate_sequence для обновления

Hibernate: обновите hibernate_sequence set next_val =? где next_val =?

Hibernate: выберите next_val в качестве id_val из hibernate_sequence для обновления

Hibernate: обновите hibernate_sequence set next_val =? где next_val =?

Hibernate: вставить в клиент (имя, фамилия, id) значения (?,?,?)

Hibernate: вставить в контакт (contact_type, cust_id, number, id) значения (?,?,?,?)

Hibernate: вставить в контакт (contact_type, cust_id, number, id) значения (?,?,?,?)

Hibernate: вставить в значения ролей (код, имя, идентификатор) (?,?,?)

Hibernate: вставка значений роли (код, имя, идентификатор) (?,?,?)

Hibernate: вставить в значения customer_role (role_id, cust_id) (?,?)

Hibernate: вставить в значения customer_role (role_id, cust_id) (?,?)

Hibernate: выбрать customer0_.id в качестве id1_1_ , customer0_.first_name как first_na2_1_, customer0_.last_name как last_nam3_1_ от клиента customer0_, где customer0_.first_name =?

2020-03-22 23: 04: 16.160 INFO 40143 --- [main] aojkrCustomerRepositoryTest: контакты: [ Контакт (id = 2, номер = 2348756234, contactType = PHONE), Контакт (id = 3, номер = 040404040, contactType = M OBILE)]

2020-03-22 23: 04: 16.160 INFO 40143 --- [main] aojkrCustomerRepositoryTest: role: [Role (id = 4, name = General User, code = USER), Role ( id = 5, name = Administration, код = ADMIN)]

Hibernate: вставить в значения customer_role (role_id, cust_id) (?,?)

2020-03-22 23:04: 16.183 WARN 40143 --- [main] ohengine.jdb c .spi.SqlExceptionHelper: SQL Ошибка: 1062, SQLState: 23000

2020-03-22 23: 04: 16.184 ОШИБКА 40143 - - [main] ohengine.jdb c .spi.SqlExceptionHelper: повторяющаяся запись '4-1' для ключа 'PRIMARY'

2020-03-22 23: 04: 16.185 INFO 40143 --- [main ] ohejbinternal.AbstractBatchImpl: HHH000010: при выпуске пакета он все еще содержал операторы JDB C

2020-03-22 23: 04: 16.202 WARN 40143 --- [main] ostest.context.TestContextManager: Caught исключение при вызове обратного вызова afterTestMethod для TestExecutionListener

Если вы заметите в конце этого журнала, jpa попытается вставить новую запись и завершится неудачей. * 10 62 *

Я создаю проект в github для справки, как показано ниже:

https://github.com/mehdizj2000/mehdi-sample.git

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