web-dev-qa-db-fra.com

Colonne JPA avec un soulignement incorrect

J'utilise JPA pour l'accès à la base de données et annoté chaque colonne avec le nom correct. Maintenant, si j'exécute une requête (par exemple findAll()), elle renvoie

Unknown column 'program0_.program_id' in 'field list'

Le message d'erreur est correct program_id Est inconnu car le vrai nom est programId.

Modèles: Programme

  @Entity
  @Table(name = "programs")
  @XmlRootElement
  public class Program implements Serializable {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Basic(optional = false)
          @Column(name = "programId")
          private Long programId;
          @ManyToMany
          @JoinTable(
                  name = "programlabels",
                  joinColumns = {
                    @JoinColumn(name = "program", referencedColumnName = "programId")},
                  inverseJoinColumns = {
                    @JoinColumn(name = "label", referencedColumnName = "labelId")})
          private Collection<Label> labels;
        }

Étiquette

@Entity
@Table(name = "labels")
@XmlRootElement
public class Label implements Serializable {
  @Id
  @Basic(optional = false)
  @NotNull
  @Size(min = 1, max = 100)
  @Column(name = "labelId")
  private String labelId;  
}

Requête

select program0_.program_id as program_1_5_, ...

Y a-t-il une raison pour laquelle JPA change "programId" en "program_id" ou est-ce qu'il me manque une configuration?

merci

Modifier: Oh désolé, j'ai oublié d'ajouter le code de requête/les informations.

J'utilise l'interface JpaRepository de Spring Data et j'ai essayé la requête findAll().

@Repository
public interface ProgramRepository extends JpaRepository<Program, Long> {}
21
KenavR

Comme décrit dans spring-boot-jpa-column-name-annotation-ignored , le nom de votre colonne est converti en cas de serpent.

Solutions possibles:

  • Configurer une stratégie de dénomination
  • Utilisez des noms de colonne en minuscules dans vos annotations
17
David SN

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jpa.hibernate.naming.strategy n'est pas une propriété prise en charge pour l'implémentation Spring JPA avec Hibernate 5.

Utilisez la propriété ci-dessous dans application.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
19
Mohammed Rafeeq

Ont pu cartographier

@ Colonne (name = "PersonFullName")

chaîne privée PersonFullName;


au nom de colonne de la table de base de données " PersonFullName " sans le soulignement.

Ce qui suit a fonctionné pour moi. Ajoutez-le dans les paramètres de l'application, puis utilisez @Column pour spécifier le nom de colonne de la base de données physique pour la propriété du modèle.

@ Colonne (name = "PersonFullName")

Dans Application.properties

spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

2
Shuchita Bora