2016-05-01 8 views
1

verwende ich Federdaten JPA in meiner Web-app, ich Entität Benutzer habenSpring Data JPA-Abfrage funktioniert nicht, Spalte existiert nicht

@Entity 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private Long id; 
    private String password; 
    private String email; 
    private Boolean enabled; 
    private String name; 
    private String lastname; 
    private String userRole; 

    public User() { 
    } 

    public User(String password, String email, Boolean enabled, String name, String lastname, String userRole) { 
     this.password = password; 
     this.email = email; 
     this.enabled = enabled; 
     this.name = name; 
     this.lastname = lastname; 
     this.userRole = userRole; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "users_id_seq") 
    @SequenceGenerator(name="users_id_seq", sequenceName="users_id_seq", allocationSize = 1) 
    @Column(name = "id", nullable = false) 
     public Long getId() { 
     return id; 
    } 

//Other columns 
} 

Und ich habe UserRepository Schnittstelle, die CrudRepository erstreckt. Wenn ich Methode findAll in meinem Controller-anrufe, bekomme ich diesen Fehler

01-May-2016 22:45:58.674 WARN [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions SQL Error: 0, SQLState: 42703 
01-May-2016 22:45:58.675 ERROR [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions Error: column user0_.id does not exist 
    Position: 8 

Meine Feder-config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

    <jpa:repositories base-package="com.birthright.repository"/> 

    <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="packagesToScan" value="com.birthright.entity"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
      </props> 
     </property> 
    </bean> 

    <tx:annotation-driven/> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver"/> 
     <property name="url" value="jdbc:postgresql://localhost:5432/AutoService"/> 
     <property name="username" value="postgres"/> 
     <property name="password" value="root"/> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="myEmf"/> 
    </bean> 

</beans> 

Mein Tisch in postgresql

CREATE TABLE public."user" 
(
    id integer NOT NULL DEFAULT nextval('users_id_seq'::regclass), 
    password character varying, 
    email character varying, 
    enabled boolean, 
    name character varying, 
    lastname character varying, 
    user_role character varying, 
    CONSTRAINT users_pkey PRIMARY KEY (id) 
) 
+0

Ich denke, die Spalte in der Tabelle vorhanden ist? –

+0

Ja, und ich weiß nicht, wo das Präfix "user0_." ist genommen. – Birthright

+0

Es ist nur der Alias, der von Hibernate verwendet wird, um Ihre Benutzertabelle zu benennen –

Antwort

2

User ist ein reserviertes Schlüsselwort in PostgreSQL. Mit einer Standardbenennungsstrategie hatten Sie wahrscheinlich User Tabellenname.

Ich weiß nicht, warum @Table(name = "user", schema = "public") funktioniert. Vielleicht berücksichtigt PostgreSQL nicht public.user als ein Schlüsselwort gegenüber User.

Bitte verwenden Sie Pluralnamen für Tabellen. Es ist auch eine gute Idee, ein System- oder Subsystem-Präfix für einen Tabellennamen (xxx_users) zu verwenden.

Eine Benennungsstrategie kann für einen solchen Ansatz verwendet werden. Siehe dies als Beispiel: Hibernate5NamingStrategy

Ein Beispiel für Präfixe: StrategyOptions

+0

Sie haben Recht. Ich entferne diese Annotation und umbenannte Tabelle in den "Benutzern" und auch die ganze Arbeit. – Birthright

+0

@Birthright Es ist sehr gut. Überprüfen Sie eine Benennungsstrategie, unser Team verwendet sie, um solche Probleme nicht zu haben. Die Spaltenbenennung kann ebenfalls fehleranfällig sein. –

Verwandte Themen