2011-03-22 4 views
2

HI, j'ai un problème. Mon (je devine) couche de persistance cache mes résultats, ainsi quand je mets à jour la base de données de l'extérieur de mon application alors les données restent viciées.java web application mise en cache des données, comment l'arrêter afin que les données ne sont pas périmées!

cependant, il est en cache que la moitié du temps, j'espère que cela a un sens,

J'ai une classe

@Entity 
@Table(name = "PROVINCE") 
public class Province implements Serializable { 

@Id 
@GeneratedValue 
int id; 

String provinceName; 

String provinceMoto; 


Buildings buildings; 


Units units; 


Person person; 

.... etc 

maintenant, si je mets à jour les données qui ne sont pas une référence à un objet de classe, comme le 'nom de la province' puis les données sont très bien dans mon application et les mises à jour tout de suite. Cependant, les objets internes comme 'bâtiments' ne le sont pas et je ne peux pas comprendre comment, si je fais un rafraîchissement comme redéployer mon application, alors les données sont fraîches.

-je obtenir ma province de la base de données ici:

Query query = manager.createQuery("select p from Province p where p.person = :query"); 
     query.setHint("toplink.refresh", "true"); 
     query.setParameter("query", p); 

     province = (Province) query.getSingleResult(); 

alors comment dois-je aller de forcer qui aussi rendre les objets internes de cette classe, à savoir la « personne » de mettre à jour aussi « bâtiments ». Ma couche de persistance est de toplink essentials, et j'ai corrigé mon problème précédent qui n'était aucune mise à jour des données. et ce premier article here(it's another stack overflow page)

merci pour toute aide. J'espère avoir suffisamment expliqué mon problème

[EDIT: comme si je n'utilisais pas ce framework, il serait simplement plus facile de joindre les tables dans la base de données et de repeupler les données dans une nouvelle variable, mais je ne le ferais pas]

Répondre

0

Après avoir mis à jour les données vers la base de données, créez votre objet de valeur (également les objets de valeur enfant) ou formez une réinitialisation avec des valeurs defeault. J'espère que cela va réduire votre problème.

+0

Salut, um pourriez-vous m'expliquer s'il vous plaît dans un peu plus de détails. – David

+0

ce que je pense que votre sens est que «ré-enregistrer» les données. pour que les nouvelles valeurs soient mises en cache ???? mais je suis mise à jour les valeurs/DB de différentes applications/serveurs de sorte que les nouvelles données doivent être réinitialisées dans cette application .... – David

+0

Prenons un exemple, d'abord vous mettre à jour les données dans la base de données. après la mise à jour des données. vous atterrissez sur la même forme, sous une forme différente. Si c'est la même forme, réinitialisez le formulaire pour que toutes les valeurs de l'objet valeur ur soient définies sur les valeurs par défaut. – developer

2

Ceci est une question "Doc ça fait mal quand je ..." "Ne faites pas ça".

Si vous mettez à jour la base de données à l'arrière de Toplink, vous devez actualiser vos données comme vous l'avez fait.

Chaque fois que vous utilisez une requête de type "select" dans JPA, il va frapper la base de données. Mais, comme vous l'avez appris, pour les objets connexes, il suffit de retirer leurs clés de la base de données, puis d'utiliser la version mise en cache de préférence à la base de données.

Le lien principal a 2 antémémoires. Le cache de niveau 1 et de niveau 2. Le cache de niveau 1 est une utilisation de cache basée sur les transactions pour la session en cours. Le cache de niveau 2 est similaire, mais étendu à l'échelle de l'application. Le cache de niveau 2 correspond à ce que vous êtes le plus susceptible de rencontrer. Vous devrez donc soit continuer à utiliser l'indicateur de rafraîchissement de Toplink comme vous le faites, soit désactiver complètement le cache de niveau 2.

+0

salut acclamations oui, j'ai lu quelque chose comme ça depuis que j'essaie de résoudre ce problème. Je pensais que faire cela ... ... dans mon unité de persistance le corrigerait mais il ne le fait pas, il se plaint alors des références d'index et des choses dans le db – David

+0

Je ne sais pas précisément comment le désactiver. Mais vous pouvez également envisager Eclipselink, qui est la dernière version de l'essentiel TopLink. –

Questions connexes