D'abord les faits de base: Java WebApp, printemps, hibernate, mysql. p>
La situation est que j'ai un modèle d'objet complexe d'E.G. une voiture Il y a maintenant de nombreuses voitures et, de temps en temps, quelqu'un inspecte une voiture et crée un rapport Jusqu'à présent, le système n'a pas soutenu la possibilité de mettre à jour les propriétés de la voiture et de ses parties une fois qu'ils ont été introduites dans le système. Ce qui signifie que si une couleur du châssis ou du nombre de pneus a été modifiée, les anciens rapports refléteraient ce changement qui n'est pas ce que nous voulons. p>
Eh bien, cette fonctionnalité a maintenant été demandée. Les voitures et leurs pièces doivent être modifiables et une historique de la version doit être créée. Les anciens rapports doivent se référer aux anciennes versions des pièces et de leurs valeurs. P>
Je regarde " modifier lentement des dimensions " et il semble que la version de la voiture et ses parties pourraient être effectuées avec l'approche de type 6. p>
La chose (la torsion) que j'ai du mal à comprendre (probablement à cause de mon expérience hibernate limitée) est-ce: p>
3 Réponses :
MySQL prend en charge déclenche . Configurez un déclencheur de manière à ce que chaque fois qu'une ligne soit modifiée, la gâchette copie la rangée dans une table "archive", avec un horodatage. De cette façon, toutes les versions de données précédentes sont maintenues, que les rapports peuvent être exécutés. P>
Vous pouvez regarder jboss Envers pour la version de vos objets. Je ne suis pas sûr que cela convient à votre usecase, mais donnez-lui un look. P>
Merci pour le conseil. Les envois sont très utiles mais ne conviennent pas bien à la situation. Bon de savoir que cela existe de toute façon.
J'ai utilisé l'approche que vous suggérez (type 6) avec hibernate et cela a fonctionné bien pour moi. Les requêtes des rapports ont eu un peu plus compliquée, mais pas que beaucoup, puisque la même clause était nécessaire pour toutes les requêtes (par exemple, et: SignalerTime> = x.Starttime et (: SignalerTime J'ai créé une interface et une classe de base (une interface n'était nécessaire que pour les sous-classes temporelles dont le parent n'était pas temporel) pour les entités qui ont appuyé cette approche avec 2 propriétés (par exemple, StartTime et Mintérieur) et une classe de base pour les DAOS travaillant avec entités temporelles qui avaient souvent besoin de fonctionnalités. Choses que j'ai mis dans cette base dao: p>
La seule partie où je l'ai trouvée vraiment en désordre travaillait avec des requêtes SQL simples en cours d'exécution sur la base de données, où les clauses supplémentaires étaient nécessaires sur des tables jointes ou des sous-sélectionnements. P>
C'était à peu près l'approche que nous avons prise.