2016-02-29 46 views
0

我有spring 4+ hibernate 4.3 + psql 9.5應用程序,並且遇到了camelcase字段轉換的一些問題。JPA Hibernate camelcase字段

Hibernate: select trainservi0_.trainServiceId as trainSer1_16_, trainservi0_.category as category2_16_, trainservi0_.date as date3_16_, trainservi0_.description as descript4_16_, trainservi0_.name as name5_16_, trainservi0_.status as status6_16_, trainservi0_.trainNumber as trainNum7_16_, trainservi0_.version as version8_16_ from tms.public.train_service trainservi0_ 
2016-02-29 13:09:34 WARN SqlExceptionHelper:144 - SQL Error: 0, SQLState: 42703 
2016-02-29 13:09:34 ERROR SqlExceptionHelper:146 - ERROR: column trainservi0_.trainserviceid does not exist 
Perhaps you meant to reference the column "trainservi0_.trainServiceId". 

這裏是我的配置:

public class DataBaseProdConfig { 

    @Resource 
    private Environment env; 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan(env.getRequiredProperty("db.entity.package")); 
     em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
     em.setJpaProperties(getHibernateProperties()); 

     return em; 
    } 

    @Bean 
    public DataSource dataSource() { 
     BasicDataSource ds = new BasicDataSource(); 
     ds.setUrl(env.getRequiredProperty("db.url")); 
     ds.setDriverClassName(env.getRequiredProperty("db.driver")); 
     ds.setUsername(env.getRequiredProperty("db.username")); 
     ds.setPassword(env.getRequiredProperty("db.password")); 

     ds.setInitialSize(Integer.valueOf(env.getRequiredProperty("db.initialSize"))); 
     ds.setMinIdle(Integer.valueOf(env.getRequiredProperty("db.minIdle"))); 
     ds.setMaxIdle(Integer.valueOf(env.getRequiredProperty("db.maxIdle"))); 
     ds.setTimeBetweenEvictionRunsMillis(Long.valueOf(env.getRequiredProperty("db.timeBetweenEvictionRunsMillis"))); 
     ds.setMinEvictableIdleTimeMillis(Long.valueOf(env.getRequiredProperty("db.minEvictableIdleTimeMillis"))); 
     ds.setTestOnBorrow(Boolean.valueOf(env.getRequiredProperty("db.testOnBorrow"))); 
     ds.setValidationQuery(env.getRequiredProperty("db.validationQuery")); 
     return ds; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     JpaTransactionManager manager = new JpaTransactionManager(); 
     manager.setEntityManagerFactory(entityManagerFactory().getObject()); 

     return manager; 
    } 

    public Properties getHibernateProperties() { 
     try { 
      Properties properties = new Properties(); 
      InputStream is = getClass().getClassLoader().getResourceAsStream("hibernate.properties"); 
      properties.load(is); 

      return properties; 
     } catch (IOException e) { 
      throw new IllegalArgumentException("Can't find 'hibernate.properties' in classpath!", e); 
     } 
    } 

這裏是我的實體:

@Entity 
@Table(name = "train_service", schema = "public", catalog = "tms") 
public class TrainServiceEntity { 
    private Long trainServiceId; 
    @Id 
    @SequenceGenerator(name="train_service_trainServiceId_seq", 
      sequenceName="train_service_trainServiceId_seq", 
      allocationSize=1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
      generator="train_service_trainServiceId_seq") 
    @Column(name = "trainServiceId") 
    public Long getTrainServiceId() { 
     return trainServiceId; 
    } 

    public void setTrainServiceId(Long trainServiceId) { 
     this.trainServiceId = trainServiceId; 
    } 
.... 
} 

,因爲Hibernate翻譯 'trainServiceId' 到 'trainserviceid',但在日誌中我看到正確的字段名稱:

Hibernate: select trainservi0_.trainServiceId as trainSer1_16_, ... 

我需要做什麼,強制Hibernate不要將字段名稱轉換爲lowecase?

+0

你需要設置實體的列名在上情況下,如果你需要它以大寫字母搜索。 –

+0

我不想大寫,我不會使用與數據庫中相同的camelcase – MeetJoeBlack

+0

_「因此,Hibernate將'trainServiceId'轉換爲'trainserviceid',但在日誌中我看到正確的字段名稱」_我不明白你的意思,一個問題或不是?你怎麼知道錯誤的語句被髮送到數據庫?從數據庫日誌? –

回答

1

您可以嘗試將混合案例欄名稱放在連字符中。

@Column("\"trainServiceId\"") 

看到persistence tables,對「表有特殊字符和大小寫混合的」