Ho una semplice configurazione spring-jpa in cui ho configurato Hibernate's ImprovedNamingStrategy
. Questo significa che se la mia classe di entità ha una variabile userName
, Hibernate dovrebbe convertirla in user_name
per interrogare il database. Ma questa conversione di denominazione smesso di funzionare dopo aver aggiornato a Hibernate 5. sto ottenendo l'errore:ImprovedNamingStrategy non funziona più in Hibernate 5
ERROR: Unknown column 'user0_.userName' in 'field list'
Questo è il mio Hibernate config:
@Configuration
@EnableJpaRepositories("com.springJpa.repository")
@EnableTransactionManagement
public class DataConfig {
@Bean
public DataSource dataSource(){
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("admin");
return ds;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(Boolean.TRUE);
vendorAdapter.setDatabase(Database.MYSQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setDataSource(dataSource());
factory.setPackagesToScan("com.springJpa.entity");
Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.ejb.naming_strategy","org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.dialect","org.hibernate.dialect.MySQL5InnoDBDialect");
factory.setJpaProperties(jpaProperties);
factory.afterPropertiesSet();
return factory;
}
@Bean
public SharedEntityManagerBean entityManager() {
SharedEntityManagerBean entityManager = new SharedEntityManagerBean();
entityManager.setEntityManagerFactory(entityManagerFactory().getObject());
return entityManager;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory().getObject());
return txManager;
}
@Bean
public ImprovedNamingStrategy namingStrategy(){
return new ImprovedNamingStrategy();
}
}
Questa è la mia classe Entity:
@Getter
@Setter
@Entity
@Table(name="user")
public class User{
@Id
@GeneratedValue
private Long id;
private String userName;
private String email;
private String password;
private String role;
}
Non voglio nominare esplicitamente i miei campi di database all'interno delle annotazioni @Column. Voglio la mia configurazione che può implicitamente convertire il caso cammello in underscore.
Guida.
Non capisco il motivo per cui non si desidera utilizzare @Column –
@Tyler il suo solo per la facilità di codifica, aggiungendo "@Column" per ciascuna delle variabili è solo fastidioso, invece posso configurare Naming- Strategia che mapperà il nome della variabile ai nomi delle colonne db e posso evitare di scrivere così tante annotazioni sulla colonna – Anup