2016-03-10 6 views
7

क्या मैं

मैं जिसका मतलब है कि मेरे पास है (और चाहते हैं) कि WildFly 8.2.0 से WildFly 10.0.0 को विस्थापित करने के लिए कोशिश कर रहा हूँ क्या करना चाहते हैं Hibernate 4.3 से Hibernate 5.0 में माइग्रेट करने के लिए।हाइबरनेट 4 -> 5 माइग्रेशन: NamingStrategy परिवर्तन, टेबल्स नहीं मिला

सेटअप

Java 8u40 
Spring 4.1.9 
SQL Server 2012 
Wildfly 8.2.0 -> Wildfly 10.0.0 
Hibernate 4.3.6 -> Hibernate 5.0.7 

मैं migration guide पढ़ लिया है और मैं रणनीति नामकरण परिवर्तन ने टक्कर मार दी कर रहा हूँ। मैं havereadmanyquestions एसओ पर इसके बारे में, लेकिन मेरा थोड़ा अलग लगता है। हाइबरनेट शिकायत है कि टेबल नहीं मिला रहे हैं:

INFO [o.h.Version] HHH000412: Hibernate Core {5.0.7.Final} 
INFO [o.h.cfg.Environment] HHH000206: hibernate.properties not found 
INFO [o.h.cfg.Environment] HHH000021: Bytecode provider name : javassist 
INFO [o.h.annotations.common.Version] HCANN000001: Hibernate Commons Annotations {5.0.1.Final} 
INFO [o.h.dialect.Dialect] HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect 
INFO [o.h.envers.boot.internal.EnversServiceImpl] Envers integration enabled? : true 
INFO [o.h.validator.internal.util.Version] HV000001: Hibernate Validator 5.2.3.Final 
INFO [o.h.tool.hbm2ddl.SchemaValidator] HHH000229: Running schema validator 
INFO [o.h.t.s.e.i.InformationExtractorJdbcDatabaseMetaDataImpl] HHH000262: Table not found: SEC_AUTHORIZATION_RULES 
INFO [o.h.t.s.e.i.InformationExtractorJdbcDatabaseMetaDataImpl] HHH000262: Table not found: SEC_USER 
More tables not found ... 
INFO [o.h.hql.internal.QueryTranslatorFactoryInitiator] (ServerService Thread Pool -- 62) HHH000397: Using ASTQueryTranslatorFactory 

जब मैं डीबग लॉगिंग में स्विच मैं उदाहरण के लिए देखा है कि वह सही डीबी मेज पर इकाई बाध्यकारी है:

DEBUG [o.h.c.a.EntityBinder] Bind entity com.company.user.User on table SEC_USER 
DEBUG [o.h.c.Ejb3Column] Binding column: Ejb3Column{table=org.hibernate.mapping.Table(SEC_USER), mappingColumn=ID, insertable=true, updatable=true, unique=false} 

क्या है मेरे लिए अजीब है कि ऐप काम करता है। इस Table not found एस के बाद यह शिकायत नहीं करता है कि स्कीमा सही नहीं है। ऐप काम करता है। डेटा कार्यों का चयन, सम्मिलन, अद्यतन करना।

@Bean(name = "myEmf") 
@DependsOn({"dataSource", "flyway"}) 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setDataSource(dataSource()); 
    em.setPackagesToScan(new String[]{"com.company.**.*"}); 
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
    em.setJpaProperties(additionalProperties()); 
    return em; 
} 

private Properties additionalProperties() { 
    Properties propFile = propertiesFile(); 
    properties.setProperty("hibernate.hbm2ddl.auto", "validate"); 
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect"); 
    properties.setProperty("hibernate.show_sql", "false"); 
    properties.setProperty("hibernate.format_sql", "true"); 
    properties.setProperty("hibernate.id.new_generator_mappings", "false"); 
    properties.setProperty("hibernate.use_sql_comments", "false"); 
    properties.setProperty("hibernate.implicit_naming_strategy", "legacy-jpa"); 
    return properties; 
} 

इस correspoding इकाई में मैं तालिका नाम और स्तंभ नाम स्पष्ट नाम है:

मैं हाइबरनेट इसके माध्यम से कॉन्फ़िगर किया है वसंत-ORM अमूर्त है

@Entity 
@Table(name = "SEC_USER") 
public class User extends BaseEntity { 

    @Column(name = "LOGIN", nullable = false, unique = true) 
    private String login; 

प्रश्न

  • इस तालिका को कैसे नहीं मिला लॉग संदेश गायब हो जाते हैं?
  • यदि मेरे पास टेबल नाम स्पष्ट रूप से नामित हैं तो वे क्यों दिखाई दे रहे हैं?
  • वह कॉलम नामों के बारे में क्यों शिकायत नहीं कर रहा है?
  • वह क्यों प्रतीत होता है सही?

क्या मैं

  • उन्नयन स्प्रिंग 4.1.9 4.2.5 करने के लिए जो says he has support for Hibernate 5
  • सेट hibernate.implicit_naming_strategyविरासत-जेपीए को this
  • सेट अनुसार करने की कोशिश की मैन्युअल रूप से डिफ़ॉल्ट स्कीमा और भूमिका db_owner असाइन किया। नोट मैं हाइबरनेट 4. enter image description here

  • मैं थोड़ा और क्या मैं InformationExtractorJdbcDatabaseMetaDataImpl.java कि हाइबरनेट सूची (जो यह है) और स्कीमा नहीं देखता में पाया हाइबरनेट डिबग है के साथ पहले यह करने के लिए नहीं था। मुझे लगता है कि उसे स्कीमा देखना चाहिए। नीचे स्क्रीनशॉट देखें: कैटलॉग और स्कीमा शून्य हैं।अंतर्निहित और शारीरिक: enter image description here

उत्तर

0

नवीनतम SQL सर्वर जेडीबीसी ड्राइवर का उपयोग करके इसे हल किया गया। ए 2012 से पुराना था। अब मैंने https://www.microsoft.com/en-us/download/details.aspx?id=11774 (sqljdbc_4.2.6420.100_enu.exe -> sqljdbc42.jar) से नवीनतम जेडीबीसी 4.2 डाउनलोड और उपयोग किया और यह काम करना शुरू कर दिया। मैं SQL उपयोगकर्ता के लिए डिफ़ॉल्ट स्कीमा परिवर्तन भी वापस कर सकता हूं।

+0

हम्म। यह वास्तव में कोई मतलब नहीं है। क्या आप वाकई एक ही समय में कई चीजों की कोशिश नहीं करते हैं? एसक्यूएल-ड्राइवर संस्करण के पास इसके साथ कुछ लेना देना नहीं चाहिए। –

+0

हाँ, वास्तव में। मैंने स्कीमा के संबंध में अपने सभी परिवर्तनों को वापस कर दिया और केवल 'hibernate.implicit_naming_strategy' सेट छोड़ा और फिर जेडीबीसी चालक को आगे और पीछे स्विच किया और वह था। हो सकता है कि http://stackoverflow.com/users/1025118/vlad-mihalcea इस धागे को देखें और उस पर टिप्पणी करें :) –

0

हाइबरनेट 5 के रूप में, NamingStrategy के तर्क दो अवधारणाओं में splitted है। आपने निहित नामकरण रणनीति सही ढंग से सेट की है, लेकिन आपने भौतिक एक सेट नहीं किया है। हाइबरनेट एक संगत एक प्रदान नहीं किया है, तो आप एक अपने आप को बनाने के लिए:

public class LegacyPhysicalNamingStrategy implements PhysicalNamingStrategy { 
    private final Pattern pattern = Pattern.compile("(\\p{Lower}+)(\\p{Upper}+)"); 
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) { 
     return convert(name); 
    } 

    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironmen) { 
     return convert(name); 
    } 

    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironmen) { 
     return convert(name); 
    } 

    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironmen) { 
     return convert(name); 
    } 

    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironmen) { 
     return convert(name); 
    } 

    private Identifier convert(Identifier identifier) { 
     if (identifier == null || identifier.getText().trim().isEmpty()) { 
      return identifier; 
     } 

     String text = identifier.getText(); 
     text = pattern.matcher(text).replaceAll("$1_$2").toLowerCase(); 
     return Identifier.toIdentifier(text, identifier.isQuoted()); 
    } 

} 

ऊपर वर्ग की पूरी तरह से योग्य वर्ग के नाम करने के लिए संपत्ति hibernate.physical_naming_strategy सेट करके ऐसा उपयोग करने के लिए बदलें।

+0

मैं इस को सत्यापित किया है लेकिन यह है कि यह नहीं है। मेरे मामले में ऐसा लगता है कि यह जेडीबीसी चालक था। –

5

मैं एक ही समस्या का पता लगा रहा था, लेकिन jtds चालक के साथ। कुछ शोध के बाद, मैंने स्थापित किया, कि SqlServerDialect के साथ हाइबरनेट sp_tables तालिका घोषणाओं को खोजने के लिए संग्रहीत प्रक्रिया का उपयोग करता है। उस एसपी में दूसरा पैरामीटर स्कीमा नाम है, इसलिए, यदि यह null तालिका खोज सही तरीके से काम करता है और यदि यह स्ट्रिंग खाली है - नहीं।

हाइबरनेट दो मामलों में null को यह पैरामीटर सेट:

  • अगर बोली विधि getNameQualifierSupport()NameQualifierSupport.CATALOG देता है, लेकिन सभी SqlServerDialects null
  • वापसी करता है, तो ड्राइवर returs में false 'supportsSchemasInTableDefinitions()' विधि, लेकिन jtds रिटर्न true

इसे हल करने के लिए, मैंने SqlServer2012Dialect अंत getNameQualifierSupport() विधि ओवरराइड करने का निर्णय लिया।

public class SqlServer2012DialectWithCatalogOnly extends SQLServer2012Dialect { 
    @Override 
    public NameQualifierSupport getNameQualifierSupport() { 
     return NameQualifierSupport.CATALOG; 
    } 
} 

और नए वर्ग के लिए org.company.SqlServer2012DialectWithCatalogOnly

आशा इस मदद करता है ...

0

संपत्ति hibernate.dialect सेट मुझे लगता है कि आप सभी को पता है दिलचस्पी होगी, मैं निम्नलिखित टिकट प्रवेश करने के बाद:

https://hibernate.atlassian.net/browse/HHH-11424

माइक्रोसॉफ्ट जेडीबीसी ड्राइवर को जेटीडीएस को अपडेट करना आपको एक ड्राइवर देगा जोलागू करता हैजो, जाहिर है, रिपोर्ट के अनुसार, समस्या को हल करें।

हालांकि, आपको लगता है कि चालक को अद्यतन करते हैं, और आप default_schema पर भरोसा करते हैं प्रभावी रूप से स्थान टेबल द्वारा दर्शाया जाता है बदलने के लिए (इतना है कि यह, वर्तमान उपयोगकर्ताओं को डिफ़ॉल्ट 'dbo' स्कीमा पर गौर नहीं करता उदाहरण के लिए) यदि आप एक अनुकूलित SchemaNameResolver प्रदान किए बिना, अभी भी भाग्य से बाहर हो जाएगा।

इस सब का असली परेशान टुकड़ा यह है कि अंतर्निहित SchemaName सत्यापन के दौरान कभी भी लागू नहीं किया जा रहा है।

0

मैं वही समस्या थी और मैं इस तरह से हल:

jpaProperties.put("hibernate.hbm2ddl.jdbc_metadata_extraction_strategy", "individually")

संबंधित मुद्दे