2014-03-25 8 views
5

Ich habe eine globale Benennungsstrategie, aber für einige Entitäten möchte ich eine andere verwenden. Ist es möglich, in jpa oder Winterschlaf?Hibernate Benennungsstrategie pro Entität

Klarstellung: Ich möchte nicht @Table (name = "xxx") noch @Column (name = "xxx") verwenden. Ich frage nach Benennungsstrategie Komponente (zum Beispiel hier beschrieben: Hibernate naming strategy). das ist eine Komponente, die die Spalten- und Tabellennamen für Sie ableitet

+0

Was ist mit '@Entity (name =" yourNameHere ")'? Oder was meinst du mit Benennungsstrategie? Bitte klären Sie. – Zhedar

+0

durch die Benennung der Strategie meine ich "die Möglichkeit zu vermeiden, manuell Spaltennamen bereitzustellen": http://stackoverflow.com/questions/19146246/hibernate-naming-strategie – piotrek

+0

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. –

Antwort

2

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.

-1

Ja. Sie können JPA-Anmerkungen wie @Table (Name = ...) und @Column (Name = ...) verwenden, um benutzerdefinierte Namen für Entitäten anzugeben. Und da dies JPA-Anmerkungen sind, funktioniert es auch im Ruhezustand.

+0

Ich weiß, dass ich die Felder manuell benennen kann.aber kann ich es vermeiden wollen, indem Sie unterschiedliche Benennungsstrategie verwenden – piotrek

+0

So wollen Sie eigentlich keine Namensgebung _per entity_ wie im Titel beschrieben, aber eine Benennungsstrategie _per Gruppe von entities_. – Ben

Verwandte Themen