1
votes

Ignorer la colonne si elle n'existe pas dans la table Spring Data JPA

J'ai une classe abstraite comme ci-dessous:

@Entity
@Table(name= "table2")
public class TValide extends BaseEntity {

    @Colmun(name = "mail")
    String mail;

}

et deux entités étendent BaseEntity

Première classe

@Entity
@Table(name= "table1")
public class TValideB  extends BaseEntity {

 @Column(name = "phone")
 String phone;

}

Deuxième classe

@MappedSuperclass
public  abstract class BaseEntity {

    @Id
    Long id;
    String name;

//getters and setters 
}

Lorsque j'essaie d'enregistrer TValide, j'obtiens une erreur comme celle-ci colonne non valide "nom" ; Dans ma table2 non colonne exsit pour le nom.

Ma question est de savoir comment puis-je ignorer cette colonne et enregistrer mon entité? Existe une autre approche sans supprimer le nom de la colonne du résumé classer?


3 commentaires

Le but de créer une entité de base abstraite est que chaque autre entité puisse l'étendre, donc ne fournissez que les champs absolument nécessaires dans les classes abstraites. Si vous avez besoin d'un nom dans une entité et pas dans d'autres, il n'est généralement pas approprié de le conserver dans BaseEntity.


@ROHAN. oui mais je cherche s'il existe d'autres approches et merci


Oui c'est d'accord. Je suggérais. J'ai publié une réponse, faites-moi savoir si cela aide ou non.


4 Réponses :


0
votes

Cela devrait résoudre votre problème. Dans votre classe qui étend BaseEntity , faites ceci pour la colonne que vous ne voulez pas.

@Entity
@AttributeOverride(name = "name", column = @Column(name = "name", insertable = false, updatable = false)
public class TValide extends BaseEntity {

    @Colmun(name = "mail")
    String mail;

}


8 commentaires

imaginez si j'ai beaucoup d'attributs dans la classe abstraite, donc dans chaque entité, je dois utiliser AttributeOverride est douloureux :(


Oui mais cela semble être la seule solution et ce n'est pas aussi douloureux car vous n'avez à l'écrire qu'une seule fois dans votre classe. Et comme je l'ai dit, si votre BaseEntity est en fait une classe abstraite et n'a que des champs absolument nécessaires, vous n'aurez probablement pas besoin de le faire beaucoup de fois


em mais j'ai besoin de réécrire La colonne existe déjà dans BaseEntity :(


Pourquoi auriez-vous besoin de réécrire une colonne qui existe déjà dans BaseEntity?


pour définir AttributeOverride dans mon entité


comme j'ai besoin de développer une annotation pour rendre la colonne nécessaire ou non


Oui, je peux comprendre mais c'est le moins que vous puissiez faire pour atteindre ce que vous voulez réaliser pour autant que je sache :) Vous n'en aurez besoin que lorsque vous voudrez rendre la colonne PAS nécessaire btw


Merci, mon ami



1
votes

Si vous devez utiliser des classes de base, vous pouvez en créer deux.

@MappedSuperclass
public  abstract class BaseEntityWithId {

    @Id
    Long id;

//getters and setters 
}

@MappedSuperclass
public  abstract class BaseEntityWithName extends BaseEntityWithId {

  String name;    

//getters and setters 
}

Il vous suffit ensuite de choisir la bonne en fonction de la disposition des colonnes du tableau.

p>


2 commentaires

J'ai suivi cette approche en premier, mais j'ai beaucoup de table et d'entité, donc si je lance votre approche, je dois créer beaucoup de classes abstraites pour répondre aux besoins


@ A.khalifa finalement vous devez cesser d'ignorer les signaux que l'approche que vous prenez est la mauvaise. D'après mon expérience, avoir des entités plates qui définissent toutes les propriétés qu'elles contiennent et utiliser Lombok pour minimiser le code standard est la seule façon de procéder. Vous pouvez même générer du code d'entité, la plupart des IDE ont un plugin ou une fonctionnalité intégrée pour le faire. Si vous faites ce petit effort initial, votre futur moi vous remerciera lorsqu'un changement sur la base de données est soudainement demandé et qu'il suffit d'un petit changement dans une entité pour le faire.



0
votes

Changez la façon dont vous utilisez l'abstraction. Créez une nouvelle classe abstraite qui étend BaseEntity contient des champs qui sont rarement utilisés.

Exemple:

@MappedSuperclass
public  abstract class BaseEntity {

   @Id
   Long id;

   //getters and setters 
}


@MappedSuperclass
public  abstract class BaseNameEntity extends BaseEntity {

   String name;

   //getters and setters 
}


@Entity
@Table(name= "table1")
public class TValideB  extends BaseNameEntity {

  @Column(name = "phone")
  String phone;

  //getters and setters 
}



@Entity
@Table(name= "table2")
public class TValide extends BaseEntity {

  @Column(name = "mail")
  String mail;

  //getters and setters 
}

En faisant cela, vous pouvez configurer toute votre structure.


0 commentaires

0
votes

Je viens d'ajouter @Column dans le nom avec insertable = false, updatable = false éditer ma classe abstraite comme ci-dessous:

@MappedSuperclass
public  abstract class BaseEntity {

    @Id
    Long id;
    @Column(name = "name", insertable=false, updatable=false)
    String name;

//getters and setters 
}

Cette approche m'évite de créer un beaucoup d'attributs de remplacement de classe abstraite ou de réécriture.


0 commentaires