ImprovedNamingStrategy ne fonctionne plus en mode veille prolongée 5
J'ai simple printemps-configuration jpa où j'ai configuré Hibernate ImprovedNamingStrategy
. Cela signifie que si ma classe d'entité a une variable userName
, puis mise en veille prolongée doit le convertir en user_name
pour l'interrogation de la base de données. Mais cette conversion de nom cessé de fonctionner après la mise à niveau de mise en veille prolongée 5. J'obtiens l'erreur:
ERROR: Unknown column 'user0_.nom d'utilisateur' in 'field list'
C'est mon 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();
}
}
C'est ma classe d'Entité:
@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;
}
Je ne veux pas explicitement le nom de mon champs de base de données dans la Colonne @annotations. Je veux que ma configuration qui peut convertir implicitement chameau cas de soulignement.
Veuillez guide.
- Je ne comprends pas pourquoi vous ne voulez pas utiliser la Colonne @
- ses juste pour la facilité de codage, d'ajouter "@Column" pour chacune des variables est tout simplement ennuyeux, au contraire je peux configurer le Nom de la Stratégie qui sera la carte le nom de la variable dans la base de données des noms de colonne et je peux éviter d'écrire de si nombreuses Colonne d'annotation
Vous devez vous connecter pour publier un commentaire.
Merci de poster votre propre solution. Ça m'aide beaucoup pour configurer Hibernate 5 stratégie de nommage!
La
hibernate.ejb.naming_strategy
propriété de pré-Hibernation 5.0 semble divisé en deux parties:hibernate.physical_naming_strategy
hibernate.implicit_naming_strategy
Les valeurs de ces propriétés ne pas mettre en œuvre la
NamingStrategy
interface comme l'a faithibernate.ejb.naming_strategy
. Il y a deux nouvelles interfaces pour ces fins:org.hibernate.boot.model.naming.PhysicalNamingStrategy
org.hibernate.boot.model.naming.ImplicitNamingStrategy
Hibernate 5 ne fournit qu'une seule mise en œuvre de
PhysicalNamingStrategy
(PhysicalNamingStrategyStandardImpl
) qui suppose physique identifiant les noms sont de la même logique que ceux.Il existe plusieurs implémentations de
ImplicitNamingStrategy
mais je l'ai trouvé aucun équivalent de l'ancienImprovedNamingStrategy
. (Voir:org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
)Donc, j'ai mis en place mon propre
PhysicalNamingStrategy
qui est très simple:Noter que le
addUnderscores()
méthode est à partir de l'originalorg.hibernate.cfg.ImprovedNamingStrategy
.Ensuite, j'ai mis cette stratégie dans le persistence.xml fichier :
C'est un piège pour définir Hibernate 5 stratégie de nommage que les réglages des versions précédentes.
hibernate.implicit_naming_strategy
peut être réglé pourorg.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
implements Serializable
tandis que leorg.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
implémente déjà que?spring.jpa.properties.hibernate.physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
Voir également la documentation hibernate pour plus de détails: docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/...Merci et +1 pour Samuel Andrés pour la réponse utile, cependant, il est probablement une bonne idée d'éviter l'écrit à la main serpent du corps de la logique. Ici est la même solution, à l'aide de la Goyave.
Il suppose que votre entité noms sont écrits dans le
StandardJavaClassFormat
et les noms de colonne dans lastandardJavaFieldFormat
J'espère que cela va sauver certaines personnes de venir ici à l'avenir quelques recherches sur google 🙂
merci pour ce post. Peu souvent embêtant que la mise à niveau des sauts de la table et de la colonne nom de la stratégie. Au lieu de copier la logique de
ImprovedNamingStrategy
vous pouvez également utiliser la délégation.ImprovedNamingStrategy
implémente une interface obsolète. Alors que seule l'interfaceNamingStrategy
est explicitement marquée comme obsolète je suppose que une fois que l'un est enlevé toutes les classes seront supprimés.espère que cela aide:
mise en veille prolongée.implicit_naming_strategy=....ImplicitNamingStrategy
mise en veille prolongée.physical_naming_strategy=....PhysicalNamingStrategyImpl
et voici le code (juste re-arrenged de code existant):
Chaque réponse postes de solution par la mise en œuvre de
PhysicalNamingStrategy
, mais tous vous avez besoin (et doivent) faire est de mettre en œuvreImplicitNamingStrategy
.Et le code peut être aussi facile que cela (à l'aide de l'original
addUnderscores
comme dans les autres réponses):Pas de Goyave et Apache utils
Viens de comprendre le problème, la configuration est très bien lors de l'utilisation d'Hibernate version < 5.0, mais pas pour Hibernate >= 5.0.
J'ai été en utilisant Hibernate 5.0.0.Final avec le Printemps 4.2.0.La LIBÉRATION. Je suppose que les Hibernate 5 n'est pas entièrement compatible avec le Printemps 4.2 . J'ai juste déclassé à Hibernate de 4.2.1.Final et les choses ont commencé à bien fonctionner.
De Hibernate
NamingStrategy
classe est obsolète dans Hibernate 5.