2014-05-04 35 views
6

Sto usando spring-data-jpa su un progetto webmvc di primavera. Sto affrontando un problema utilizzando query creation su un repository di una delle mie entità. Qui sotto puoi vedere la mia entità, il mio deposito e l'eccezione.Spring-Data-Jpa Repository - Underscore sul nome della colonna Entity

mia entità,

@Entity 
@Table(schema = "mainschema") 
@XmlRootElement 
public class Municipalperson implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(nullable = false) 
    private Integer id; 

    @Basic(optional = false) 
    @Column(name = "municipal_id", nullable = false) 
    private Integer municipal_id; 

    @Basic(optional = false) 
    @Column(nullable = false, length = 60) 
    private String firstname; 

    public Municipalperson(Integer id, Integer municipal_id, String firstname) { 
     this.id = id; 
     this.municipal_id = municipal_id; 
     this.firstname = firstname; 
    } 


    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Integer getMunicipal_id() { 
     return municipal_id; 
    } 

    public void setMunicipal_id(Integer municipal_id) { 
     this.municipal_id = municipal_id; 
    } 

    public String getFirstname() { 
     return firstname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 
} 

mio repository,

@Repository 
public interface MunicipalpersonRepository extends JpaRepository<Municipalperson, Integer> { 

    List<Municipalperson> findByMunicipal_idOrderByLastnameDesc(int municipal_id); 
} 

e l'eccezione,

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'municipalpersonRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property municipal found for type Municipalperson! 

ho cercato di impostare mynicipal_id come int, poi come Integer e lo stesso per il parametro 'municipal_id' sul mio repository, ma non tutti hanno funzionato. Inoltre, rinominare il repository in "findByMunicipalidOrderByLastnameDesc" e "findByMunicipalIdOrderByLastnameDesc", ma non ha funzionato neanche.

Infine i rinominato il municipal_id a municipalId (sottolineatura rimosso) e anche rinomina getter/setter e Repository (findByMunicipalIdOrderByLastnameDesc) e il problema risolto.

La mia domanda è perché questo sta accadendo?

+1

Spring Data JPA fa molto affidamento sulle convenzioni di denominazione Java. Hai scelto di non rispettarli avendo un trattino basso nel tuo campo e i nomi degli utenti. Ecco perché sei stato morso. Rispetta le convenzioni sui nomi Java e JPA di Spring Data sarà felice e il tuo codice sarà più leggibile come bonus. Non che la colonna possa essere nominata come vuoi, anche con caratteri di sottolineatura. Ciò che conta sono i nomi dei campi associati. –

+0

Grazie mille per il tuo commento. Non conoscevo le convenzioni di denominazione java. Ho trovato anche questa [domanda di stackoverflow] (http://stackoverflow.com/questions/150192/using-underscores-in-java-variables-and-method-names) che mi ha aiutato. –

risposta

20

Il trattino di sottolineatura _ è un carattere riservato nella derivazione di query Spring Data (vedere lo reference docs per i dettagli) per consentire potenzialmente la descrizione del percorso della proprietà manuale. Quindi ci sono due opzioni che si hanno:

  1. Stick al Java convenzioni di denominazione di utilizzare camel-case per i nomi delle variabili associate e tutto funzionerà come previsto.
  2. Sfuggi allo _ utilizzando un trattino basso aggiuntivo, ad esempio rinomina il metodo di query su findByMunicipal__idOrderByLastnameDesc(…).

Suggerirei il primo come se non intendessi alienare altri sviluppatori Java :).

+6

Questo non funziona. La doppia sottolineatura non cambia nulla. E i campi nell'oggetto JPA Java seguono semplicemente il nome dei campi nel database che ovviamente non segue la convenzione Java. Quindi questo deve essere un caso d'uso piuttosto comune. –

+1

Ci dispiace, ma il doppio trattino basso non funziona. – Daniel

+0

La doppia soluzione di sottolineatura non ha funzionato anche per me e non sono in grado di annullare la mia upvote ... – Zerlono

11

Ho risolto questo errore rinominando il campo con il nome senza trattino basso.

@Column(name = "municipal_id", nullable = false) 
private Integer municipalId; // <-- field was renamed 
+1

Questo è davvero il modo migliore per gestire questo scenario e dovrebbe essere la risposta accettata.Mi rendo conto che questa risposta è arrivata qualche anno dopo la domanda e la prima risposta, ma sto mettendo questo commento per attirare l'attenzione dei futuri visitatori su questa risposta. La soluzione in questo modo consente di lavorare con i database che denominano i campi in un modo che non è possibile controllare, senza deviare dagli standard di codifica generalmente accettati nell'intero campo degli sviluppatori java, ad es. mantiene i caratteri di sottolineatura completamente fuori dal tuo metodo e dai nomi delle variabili. –

+0

Il modo migliore per rimuovere l'errore senza modificare il database e tutte le informazioni di mapping. –

+0

Rispondendo al primo commento, la domanda non era "come mappare un nome di colonna db con underscore a un'entità Java", ma come utilizzare una proprietà di entità con un trattino di sottolineatura con dati di primavera. Ecco perché questa risposta non è accettata. –

Problemi correlati