web-dev-qa-db-fra.com

Vues JPA et Table. Peut-on le faire?

Nous avons actuellement un système Java EE où nous mappons à notre base de données en utilisant JPA. C'est un système assez bien développé avec environ 20 entités.

On nous a maintenant ordonné d'utiliser Views pour tout. Par exemple: si nous avons une table appelée PERMISSION alors nous avons également besoin d'une vue appelée PERMISSION_VIEW. Fondamentalement, nous devons le faire pour chaque table, et nos applications ne peuvent accéder aux données qu'en interrogeant la vue.

Maintenant, tous nos beans entité ressemblent à ceci:

@Entity
@Table(name = "PERMISSION")
@NamedQueries({
        @NamedQuery(name = "Permission.findByPK", query = "SELECT p FROM Permission p WHERE p.dpNum = :dpNumber"),
        @NamedQuery(name = "Permission.deleteAll", query = "DELETE FROM Permission") })
public class Permission implements Serializable {

}
  • Premièrement, comment est-il possible de mettre à jour des tables si vous n'êtes autorisé à utiliser que des vues. Les vues matérialisées peuvent-elles fonctionner pour cela?
  • Deuxièmement, combien de réécritures seront nécessaires, si nous ne pouvons utiliser que des vues? Par exemple. Pour chaque entrée, nous devrons écrire @ Table (name = "PERMISSION_VIEW"), pour décrire l'entité, MAIS, lors d'une mise à jour, elle doit le faire dans la table PERMISSION. Comment diable consolidez-vous cela dans un bean entité?
21
Oliver Watkins

Pour plus d'informations sur JPA et les vues de base de données, voir http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Views

Dans JPA, vous pouvez mapper vers un VIEW de la même manière qu'un tableau, en utilisant l'annotation @Table. Vous pouvez ensuite mapper chaque colonne de la vue avec les attributs de votre objet. Les vues sont normalement en lecture seule, donc le mappage des objets aux vues est normalement également en lecture seule. Dans la plupart des bases de données, les vues peuvent également être mises à jour en fonction de la complexité de la requête à encapsuler. Même pour les requêtes complexes, les déclencheurs de base de données peuvent normalement être utilisés pour se mettre à jour dans la vue.

22
James

La plupart des SGBDR modernes prennent en charge les vues insérables et modifiables. Si votre SGBDR le prend en charge, vous ne devriez avoir aucun problème. Une vue identique à une table doit pouvoir être mise à jour dans tout SGBDR prenant en charge de telles vues. Il vous suffit donc de modifier votre mappage et de remplacer les noms de table par les noms de vue.

7
nakosspy