Ich sehe keinen Weg in den Hibernate-Quellcode. Die EntityBinder
kommt mit Namen unter Verwendung ObjectNameNormalizer.NamingStrategyHelper
, die die Benennungsstrategie von entweder Configuration.namingStrategy
(die globale) oder von einem komplexen Pfad, der MetadataImpl
geht und Nirgendwo landet (keine Verwendungen) kommt.
Sie sind also wahrscheinlich mit overriding Feldnamen manuell stecken. Ich sehe nicht einmal einen naheliegenden Weg, um Zusammenhänge in diesem Bereich zu erkennen, daher denke ich, dass selbst eine Split-Brain-Naming-Strategie so aussieht, als käme sie nicht in Frage.
Update: Nachdem ich @ Anthony-acciolys Antwort gesehen habe, dachte ich, dass der letzte Satz falsch gewesen sein könnte. So testete ich es wie folgt
package internal.sandbox.domain;
@Entity
public class SomeEntity {
private String id;
private String someField;
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSomeField() {
return someField;
}
public void setSomeField(String someField) {
this.someField = someField;
}
}
mit einem JpaConfiguration
wie folgt
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("internal.sandbox.dao")
@Import(DataSourceConfiguration.class)
public class JpaConfiguration {
@Bean
@Autowired
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(DataSource dataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQL82Dialect");
vendorAdapter.setDatabase(Database.POSTGRESQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("internal.sandbox"); // note, no ".domain"
factory.setDataSource(dataSource);
Properties properties = new Properties();
properties.setProperty("hibernate.cache.use_second_level_cache", "false");
properties.setProperty("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
factory.setJpaProperties(properties);
return factory;
}
...
eine Spring Data DAO als
folgt
public interface SomeEntityDao extends CrudRepository<SomeEntity, String> {
}
und einen Integrationstest wie folgt
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationConfiguration.class, JpaConfiguration.class})
public class SomeEntityDaoIntegrationTests {
@Autowired
private SomeEntityDao someEntityDao;
@Test
public void testSave() {
SomeEntity someEntity = new SomeEntity();
someEntity.setId("foo");
someEntity.setSomeField("bar");
this.someEntityDao.save(someEntity);
}
}
habe ich Haltepunkte in die ImprovedNamingStrategy
gelegt, und classToTableName()
wurde mit "SomeEntity" aufgerufen und propertyToColumnName()
wurde mit "someField" aufgerufen.
Mit anderen Worten, Paketinformationen werden nicht übergeben. In diesem Setup kann daher nicht verwendet werden, um eine andere Benennungsstrategie basierend auf dem Paketnamen anzuwenden.
Was ist mit '@Entity (name =" yourNameHere ")'? Oder was meinst du mit Benennungsstrategie? Bitte klären Sie. – Zhedar
durch die Benennung der Strategie meine ich "die Möglichkeit zu vermeiden, manuell Spaltennamen bereitzustellen": http://stackoverflow.com/questions/19146246/hibernate-naming-strategie – piotrek
piotrek, ich denke, dass jeder Punkt hier ist. Verwenden Sie Ihre globale Benennungsstrategie für den Standardanwendungsfall und überschreiben Sie nicht standardmäßige Fälle mit Anmerkungen. Es wird viel sauberer sein als eine eigene [NamingStrategy] (http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/cfg/NamingStrategy.html) zu implementieren. –