Question

Modifier 5/11/2011:

Je suppose que c'est un peu pire que ce qui est ci-dessous; dans mon exemple QA déployé, si je viens de vous rafraîchir le tableau de bord principal un certain nombre de fois, éventuellement mon utilisateur est beaucoup à plusieurs associations de groupe sont supprimés. À ce stade, il n'y a que des déclarations de sélection étant appelés sur le côté serveur; espérons-je l'obtenir rétréci vers le bas avec ces derniers tests.

Original:

Salut à tous. Je vais avoir un problème avec un objet assez complexe; problème est le suivant: quand j'envoie l'objet du client vers le serveur pour être sauvé, il est apparemment au hasard essuyait de nombreuses à plusieurs relations sur les objets associés. Pire encore, je ne suis pas en mesure de reproduire le problème moi-même, après environ deux mois d'être au courant du problème. J'ai l'application pour tester avec un groupe d'assurance qualité; ils utilisent le programme quotidien, double entrée dans les applications nouvelles et existantes. Le problème affleure jusqu'à trois fois par jour.

Je ferai de mon mieux pour fournir autant de détails que je peux, et grandement apprécier toute personne prenant un coup d'œil!

Le cadre de l'application est GWT 2.1 + Gilead + Hibernate 3 + MySQL InnoDB. Je laisse Hibernate gérer une cascade etc, donc aucun n'est défini dans le DB, bien que toutes les clés étrangères sont définies dans la base de données.

Voici quelques extraits des correspondances:

<hibernate-mapping>
 <class name="com.example.domain.Close" table="CLOSE">

 <many-to-one name="updateUser"
class="com.example.domain.User"
column="LAST_UPDATE_USER"/>
 </class>
</hibernate-mapping>

<hibernate-mapping>
  <class name="com.example.domain.User" table="USER" batch-size="25">
    <set name="groups" table="USER_GROUP" lazy="true" batch-size="25">
      <key column="USER_ID"/>
      <many-to-many column="GROUP_ID" class="com.example.domain.Group"/>
    </set>
  </class>
</hibernate-mapping>

<hibernate-mapping>
  <class name="com.example.domain.Group" 
    table="GROUP" batch-size="25">
    <set name="users" table="USER_GROUP" lazy="true" inverse="true">
      <key column="GROUP_ID"/>
      <many-to-many column="USER_ID" class="com.example.domain.User"/>
    </set>
    <set name="permissions" table="PERMISSION_GROUP" lazy="true" inverse="true">
    <key column="GROUP_ID"/>
    <many-to-many column="PERMISSION_ID" 
      class="com.example.domain.Permission"/>
    </set>

<hibernate-mapping>
  <class name="com.example.domain.Permission" 
      table="PERMISSION">
    <set name="groups" table="PERMISSION_GROUP" lazy="true">
      <key column="PERMISSION_ID"/>
      <many-to-many column="GROUP_ID" 
        class="com.example.domain.Group"/>
    </set>
  </class>
</hibernate-mapping>

Enregistrer l'objet est un appel simple à saveOrUpdate ():

Session session = gileadHibernateUtil.getSessionFactory()
  .getCurrentSession();
session.beginTransaction();
try {
  session.saveOrUpdate(close);
} catch (Exception e) {
  e.printStackTrace();
  session.getTransaction.rollback();
}
session.getTransaction.commit();

return close;

Close « updateUser » est un objet chargé lorsque l'utilisateur se connecte à. Il est chargé avec les groupes et les permissions associées de sorte que le système peut accorder / refuser l'accès aux modules d'application. Je fais

close.setUpdateUser(exampleApp.getUser()); 

avant de l'envoyer à l'arrière de l'objet au serveur.

Il y a beaucoup d'autres endroits dans l'application où ce genre d'opération se produit, mais ne provoque pas les effets secondaires indésirables. Il se résume à la complexité du code côté client probablement associé à l'objet Close, ou plutôt ma mise en œuvre de celui-ci.

J'ai passé tellement de temps à verser sur les documents officiels Hibernate, à la recherche de problèmes liés peut-être, etc, je pensais que peut-être il était un bon moment pour demander de l'aide. Je dois à l'homme et persévérez, mais peut-être juste me demander aider à comprendre.

Je ne sais pas quoi d'autre à fournir en ce moment qui est pertinent. Espérons que ce qui est ici a donc bien la pertinence!

Merci pour votre écoute!

Modifier

May  5 12:18:38 localhost jsvc.exec[10117]: Hibernate: insert into example_dev.RECENT_ITEM (OBJECT_TYPE, OBJECT_ID, DATE, USER_ID) values (?, ?, ?, ?)
May  5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.PERMISSION_GROUP where PERMISSION_ID=?
May  5 12:18:38 localhost last message repeated 19 times
May  5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_GROUP where USER_ID=?
May  5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_DESIGNATION where USER_ID=?

Il semble que les suppressions se produisent juste après cet insert .. opérations précédentes sont toutes sélections. Mais rien dans l'utilisateur devrait être en cascade à partir RecentItem.

Était-ce utile?

La solution

Après beaucoup de recherches, je suis venu à des conclusions et a pu prendre des mesures. Tout d'abord, je l'ai appris après un peu de recherche sur le forum Gilead, qu'il n'est plus activement maintenu . Devrait avoir remarqué que plus tôt. Pendant ce temps, j'avais commencé à lire sur RequestFactory, et après quelques jours de recherche, a décidé que je devrais essayer de migrer vers cela.

Ce projet est assez grand, environ 50 objets de domaine, certaines avec de nombreuses associations d'objets. Il m'a fallu environ 40-50 heures pour réécrire tout d'utiliser GWT Gilead + RPC à l'aide RequestFactory exclusivement. Je suis très heureux avec les changements qui en résultent dans le code et la structure. Je ne suis pas trop tracassé jusqu'ici par avoir à créer des objets proxy DTO, et j'eu l'occasion de passer à Hibernate Annotations, se débarrasser des fichiers de mappage.

Il était difficile parfois de refactoriser le code pour utiliser le Fetch / modifier / enregistrer des cycles RequestFactory exige. Il m'a donné l'occasion d'améliorer une partie du code.

Les bonnes nouvelles sont, le problème a été résolu. Pas plus nombreux à plusieurs associations mystérieusement supprimés. Ma meilleure estimation est que je frappe un bogue dans Gilead, ou sur l'utilisation de celui-ci était incorrect, ou il est possible que je résolu un problème lors de la migration des annotations.

Je couru à travers quelques grandes ressources tout en apprenant RequestFactory + Hibernate, beaucoup grâce à StackOverflow (merci encore!):

En utilisant GWT RequestFactory avec Objectify - était super pour avoir une idée de la façon dont RequestFactory interagi avec le back-end, et quelques méthodes et passe-partout pour réduire le code

.

Plus de liens ci-dessous .. je l'espère, je suis encore un noob donc je suis limité dans nombre de liens hypertextes je peux poster:)

J'ai appris beaucoup, et me fais couramment RequestFactory. Je ferai de mon mieux pour garder un œil et aide ici où je pense que je peux.

Merci StackOverflow!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top