O que é contexto de persistência?

109

Sou novo no mundo Java e JPA. Eu estava estudando JPA e me deparei com muitos novos termos como Entidade, persistência. Durante a leitura, não consegui entender a definição exata para contexto de persistência .

Alguém pode explicar em termos simples para leigos? O que isso tem a ver com os dados usados ​​no @Entity?

Por exemplo, acho esta definição muito complicada de entender:

Um contexto de persistência é um conjunto de entidades de forma que, para qualquer identidade persistente, haja uma instância de entidade única.

Amrit
fonte

Respostas:

86

Um contexto de persistência lida com um conjunto de entidades que contêm dados a serem persistidos em algum armazenamento de persistência (por exemplo, um banco de dados). Em particular, o contexto está ciente dos diferentes estados que uma entidade pode ter (por exemplo, gerenciada, separada) em relação ao contexto e ao armazenamento de persistência subjacente.

Embora relacionado ao Hibernate (um provedor JPA), acho que estes links são úteis:

http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch03.html

http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/architecture.html

Em Java EE, um contexto de persistência é normalmente acessado por meio de um EntityManager.

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html

Os vários estados que uma entidade pode ter e as transições entre eles são descritos abaixo:

http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/objectstate.html

http://gerrydevstory.com/wp-content/uploads/2012/05/jpa-state-transtition.png

JamesB
fonte
hmmm, faz sentido agora. Você tem uma definição "Simples" semelhante que diga a diferença entre gerenciadores de entidades gerenciados por contêiner e gerenciados por aplicativo?
Amrit
4
O contêiner versus aplicativo basicamente diz onde o Entity Manager é criado - fora de um contêiner ou dentro do aplicativo.
uiron
66
  1. As entidades são gerenciadas pela instância javax.persistence.EntityManager usando o contexto de persistência.
  2. Cada instância EntityManager está associada a um contexto de persistência .
  3. Dentro do contexto de persistência , as instâncias de entidade e seu ciclo de vida são gerenciados.
  4. O contexto de persistência define um escopo sob o qual instâncias de entidades específicas são criadas, mantidas e removidas.
  5. Um contexto de persistência é como um cache que contém um conjunto de entidades persistentes . Assim, uma vez que a transação é finalizada , todos os objetos persistentes são separados do contexto de persistência do EntityManager e não são mais gerenciados.
pritam kumar
fonte
1
Descobri que o EclipseLink não desanexa entidades após a conclusão de uma transação ...
Ray Hulha
O cache do contexto de persistência gerenciado pelo contêiner permanecerá apenas durante a transação. As entidades lidas em uma transação serão desanexadas após a conclusão da transação e precisarão ser mescladas para serem editadas em transações subsequentes. EclipseLink . @RayHulha
pritam kumar,
4
@pritamkumar, você explicou bem o conceito de contexto de persistência. Eu apenas acrescentaria que também existe a anotação javax.persistence.PersistenceContext, que é usada para injetar um objeto EntityManager e estabelecer o escopo do objeto injetado (por exemplo, uma transação).
Paulo Merson
30

Retirado desta página:

Aqui está uma ficha rápida do mundo JPA:

  • Um Cache é uma cópia de dados, significando cópia extraída, mas vivendo fora do banco de dados.
  • Liberar um cache é o ato de colocar os dados modificados de volta no banco de dados.
  • Um PersistenceContext é essencialmente um Cache. Ele também tende a ter sua própria conexão de banco de dados não compartilhada.
  • Um EntityManager representa um PersistenceContext (e, portanto, um Cache)
  • Um EntityManagerFactory cria um EntityManager (e, portanto, um PersistenceContext / Cache)
Koray Tugay
fonte
um PersisnteceContext pode ter alguma instância de EntityManager? E pode um Entity Manager ter qualquer PersistenceContext? PersisntenceContext é apenas um para todos os aplicativos?
Roberto
7

Um contexto persistente representa as entidades que contêm dados e são qualificadas para serem persistentes em algum armazenamento persistente como um banco de dados. Uma vez que criamos commituma transação em uma sessão que tem essas entidades anexadas, o Hibernate libera o contexto persistente e as alterações ( inserir / salvar, atualizar ou excluir ) neles são persistentes no armazenamento persistente.

qwerty
fonte
7

Tanto a org.hibernate.SessionAPI quanto a javax.persistence.EntityManagerAPI representam um contexto para lidar com dados persistentes.

Este conceito é chamado de contexto de persistência . Os dados persistentes têm um estado em relação a um contexto de persistência e ao banco de dados subjacente.

PLP
fonte
5

"Um conjunto de instâncias capazes de persistir (entidade) gerenciadas por uma instância do gerenciador de entidade em um determinado momento" é chamado de contexto de persistência.

A anotação JPA @Entity indica uma entidade capaz de persistir.

Consulte a definição JPA aqui

Dhanushka
fonte
4

Em termos leigos, podemos dizer que o Contexto de Persistência é um ambiente onde as entidades são gerenciadas, ou seja, ele sincroniza "Entidade" com o banco de dados.

AggarwalM
fonte
3

Embora @pritam kumar dê uma boa visão geral, o quinto ponto não é verdade.

O Contexto de Persistência pode ter Escopo de Transação - o Contexto de Persistência 'vive' durante a transação, ou Estendido - o Contexto de Persistência abrange várias transações.

https://blogs.oracle.com/carolmcdonald/entry/jpa_caching

O EntityManager da JPA e a Sessão do Hibernate oferecem um contexto de persistência estendido.

thisismydesign
fonte
Olá, user2771889.. Você está certo. Não mencionei o escopo estendido do contexto de persistência. O quinto ponto estava relacionado apenas ao contexto de persistência com escopo de transação.
pritam kumar,
2

Contexto de persistência é um ambiente ou cache onde instâncias de entidade (que são capazes de manter dados e, portanto, ter a capacidade de ser persistentes em um banco de dados) são gerenciadas pelo Entity Manager . Ele sincroniza a entidade com o banco de dados. Todos os objetos com anotação @Entity são capazes de ser persistente. @Entity nada mais é do que uma classe que nos ajuda a criar objetos para nos comunicarmos com o banco de dados. E a forma como os objetos se comunicam é usando métodos. E quem fornece esses métodos é o Entity Manager.

neomatriz
fonte
1
Como essa resposta difere das respostas existentes?
Akin Okegbile