2017-06-12 1 views
1

Cela ne semble pas très sec.Ai-je besoin d'annotations JPA redondantes si la base de données a déjà été créée dans un script SQL?

J'ai un script SQL qui génère toutes mes tables de base de données, donc j'ai beaucoup d'annotations redondantes dans ma classe @Entity.

Par exemple,

@Column(unique = true, length = 254) 
@NotNull 
private String email; 

ou la logique d'incrémentation automatique tels que

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 

Toutes ces annotations sur le terrain sont redondantes compte dans le SQL je l'ai déjà déclaré de telles choses.

Y a-t-il une raison de conserver ces annotations? D'après ce que je comprends, n'importe quel type d'application sérieuse devrait employer des manuscrits de SQL pour créer les tables de base de données de toute façon, et il serait bien d'avoir moins de bruit dans les classes que j'écris.

Répondre

0

Deux raisons qui me viennent à l'esprit:

  1. Ils peuvent être utiles dans les tests d'intégration lorsque vous laissez hiberner créer et schéma déposer dans une base de données en mémoire qui est utilisée dans les tests.
  2. Très peu d'entre eux sont également utilisés par Hibernate dans l'exécution pour faire un peu optimizations, comme optional = false (non nul) en combinaison avec @PrimaryKeyJoinColumn pour un à-un lorsqu'Hibernate sait qu'il est sûr de faire une procuration pour l'association paresseuse au lieu de passer à un chargement passionné.
1

il y a deux types d'annotations (DDL et types de validation) dans votre exemple:

@Column(unique = true, length = 254) 
@NotNull 
  1. @NotNull est une JSR 303 annotation de validation Bean. Cela n'a rien à voir avec les contraintes de la base de données elle-même. Il est utilisé par le processeur de validation et n'est pas connecté avec DB. donc ce n'est pas redondant dans votre cartographie. Mais, par exemple

    @Column (annulable = false) - il donne au fournisseur JPA laisse deviner pour générer le droit DDL pour créer des colonnes de table avec les contraintes de base de données

2. @ Colonne (unique = vrai, longueur = 254) ce sont des indices pour ddl que hibernate génère.

mais pour @Column (actualisable = false, name = "flight_name", annulable = false, longueur = 50) actualisable - ce n'est pas ddl, c'est l'optimisation.

from hibernate docs

@Column(
    ddl/mapping : name="columnName"; 
    optimization: boolean insertable() default true; 
    optimization: boolean updatable() default true; 
    ddl/mapping : String table() default ""; 
    DDL -->: boolean unique() default false; 
    DDL -->: boolean nullable() default true; 
    DDL -->: String columnDefinition() default ""; 
    DDL -->: int length() default 255; 
    ...... 
) 

Si vous utilisez des scripts ddl tous hibernate attributs ddl-annotation sont redondantes (si vous utilisez dans les tests de mémoire, il y aura autogenaration pour en mémoire db) et ne seront utilisées que si vous avez configuré hibernate.hbm2ddl.option automatique dans hibernate/jpa config. C'est aussi un scénario très dangereux lorsque vous donnez l'autorisation à hibernate de faire du DDL en production.

pour le travail avec production: voir liquibase, flywaydb pour DDL.