Olá, pelo que entendi, seguindo o jpa, só há uma maneira de remover entidade desanexada:
factory.withTransaction((session, transaction) ->
session.merge(sampleEntity).invokeUni(session::remove)
).await().indefinitely();
Tudo está bem, mas se for sobre desempenho, a operação de mesclagem leva muito tempo e pode causar problemas reais de desempenho. Por exemplo, de acordo com minhas medições de tempo imprecisas, a remoção de 5000 entidades leva ~ 4s, em hibernação leva 50ms.
Acabei de ler sobre um novo método chamado session.getReference
que retorna a instância persistente de determinada entidade. É possível permitir seu uso por session.remove
?
Acabei de ler sobre um novo método chamado
session.getReference
que retorna a instância persistente de determinada entidade. É possível permitir seu uso parasession.remove
?
Ah, bom ponto, absolutamente você deve ser capaz de fazer isso. Eu fiz funcionar no # 360.
No entanto, quero que você entenda que não há como remove()
um objeto sem buscá-lo primeiro. Isso porque remove()
tem semânticas como exclusão em cascata e remoção de coleção que dependem de ter o estado da entidade na sessão.
Se você realmente precisa ser capaz de excluir uma entidade sem buscá-la, você deve usar StatelessSession.delete()
ou uma consulta HQL delete
.
PS @ Xset-s obrigado por relatar isso, foi um grande descuido da minha parte
Não há problema, obrigado pela sua resposta detalhada sobre a operação de remoção e por uma solução muito rápida. Estou conduzindo experimentos agora e reescrevendo meu aplicativo do lado do servidor usando sua nova biblioteca incrível, então é fácil para mim detectar alguns problemas complicados, que só poderiam ser capturados somente assim (ou usando um grande número de testes 😄)