Менеджер сущностей меняет отдельные сущности - PullRequest
0 голосов
/ 16 апреля 2020

Помоги мне.

Почему коллекция в сущности изменяется после транзакции?

Моя сущность:

@Entity
class Entity(
  @Id
  val uuid: UUID,

  @OneToMany(cascade = [CascadeType.PERSIST, CascadeType.REMOVE])
  @JoinTable(
    name = "entities_items",
    joinColumns = [JoinColumn(name = "entity_uuid")],
    inverseJoinColumns = [JoinColumn(name = "item_uuid")]
  )
  val items: MutableList<Item>
) 

Моя проверка:

@SpringBootTest
internal class EntityTest {
  @Autowired
  lateinit var entityRepository: EntityRepository

  @Autowired
  lateinit var transactionManager: PlatformTransactionManager

  @Test
  fun will_added_item() {
    val entityBefore = entityRepository.findById(entityId).get()
    // entityBefore.items.size == 0

    TransactionTemplate(transactionManager).execute { _ ->
      val entity = entityRepository.findById(entityId).get()

      entity.items.add(item)
    }

    // entityBefore.items.size == 1 <-- ???
    val entityAfter = entityRepository.findById(entityId).get()
  }
}

Интересно, если я добавлю любой вызов в коллекцию до транзакции, все будет хорошо.

Spring Boot + Hibernate + JUnit

1 Ответ

0 голосов
/ 16 апреля 2020
  • пожалуйста, проигнорируйте этот неправильный ответ - кажется, не могу удалить его на моем телефоне!

Это потому, что когда вы извлекаете элемент по идентификатору в транзакции несколько раз, Hibernate будет дать вам тот же объект, что и управление объектами, участвующими в транзакции, как единицу работы.

Следовательно, entityBefore и entity указывают на один и тот же объект.

Извините, не обращайте на это внимания - я вижу, что первый поиск был вне tx!

...