खोज…


एक कस्टम ImplicitNamingStrategy बनाना और उपयोग करना

एक कस्टम बनाया जा रहा है ImplicitNamingStrategy आप tweak करने के लिए कैसे हाइबरनेट करने के लिए नाम आवंटित होगा की अनुमति देता है गैर स्पष्ट नाम Entity गुण, विदेशी कुंजी, अद्वितीय कुंजी, पहचानकर्ता स्तंभ, बुनियादी स्तंभ, इत्यादि शामिल है।

उदाहरण के लिए, डिफ़ॉल्ट रूप से, हाइबरनेट विदेशी कुंजी उत्पन्न करेगा जो हैशेड हैं और समान दिखते हैं:

FKe6hidh4u0qh8y1ijy59s2ee6m

हालांकि यह अक्सर कोई समस्या नहीं होती है, आप चाह सकते हैं कि नाम अधिक वर्णनात्मक था, जैसे:

FK_asset_tenant

यह आसानी से एक कस्टम ImplicitNamingStrategy साथ किया जा सकता है।

यह उदाहरण ImplicitNamingStrategyJpaCompliantImpl विस्तार करता है, हालाँकि आप चाहें तो ImplicitNamingStrategy को लागू कर सकते हैं।

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.ImplicitForeignKeyNameSource;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;

public class CustomNamingStrategy extends ImplicitNamingStrategyJpaCompliantImpl {

    @Override
    public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) {
        return toIdentifier("FK_" + source.getTableName().getCanonicalName() + "_" + source.getReferencedTableName().getCanonicalName(), source.getBuildingContext());
    }

}

Hibernate को यह बताने के लिए कि कौन सा ImplicitNamingStrategy उपयोग करने के लिए, अपने persistence.xml में hibernate.implicit_naming_strategy संपत्ति को परिभाषित करें। persistence.xml या hibernate.cfg.xml नीचे देखें:

<property name="hibernate.implicit_naming_strategy"
                  value="com.example.foo.bar.CustomNamingStrategy"/>

या आप नीचे दिए अनुसार hibernate.properties फ़ाइल में संपत्ति निर्दिष्ट कर सकते हैं:

hibernate.implicit_naming_strategy=com.example.foo.bar.CustomNamingStrategy

इस उदाहरण में, सभी विदेशी कीज़ जिनके पास स्पष्ट रूप से परिभाषित name नहीं है, अब उनका नाम CustomNamingStrategy से मिल जाएगा।

कस्टम शारीरिक नामकरण रणनीति

डेटाबेस टेबल के नाम पर अपनी संस्थाओं की मैपिंग करते समय हम एक @Table एनोटेशन पर भरोसा करते हैं। लेकिन अगर हमारे पास अपने डेटाबेस तालिका नामों के लिए एक नामकरण सम्मेलन है, तो हम उन नामों के आधार पर तालिका नामों की गणना करने के लिए हाइबरनेट बताने के लिए एक कस्टम भौतिक नामकरण रणनीति को लागू कर सकते हैं, बिना उन नामों को स्पष्ट रूप से @Table साथ बताते हुए। एक ही विशेषता और कॉलम मैपिंग के लिए जाता है।

उदाहरण के लिए, हमारी इकाई का नाम है:

ApplicationEventLog

और हमारी तालिका का नाम है:

application_event_log

हमारी भौतिक नामकरण रणनीति को उन इकाई नामों से परिवर्तित करने की आवश्यकता है जो ऊंट मामले में हमारे db तालिका नामों के लिए हैं जो कि साँप का मामला है। हम हाइबरनेट के PhysicalNamingStrategyStandardImpl का विस्तार करके इसे प्राप्त कर सकते हैं:

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class PhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl {

    private static final long serialVersionUID = 1L;
    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    protected static String addUnderscores(String name) {
        final StringBuilder buf = new StringBuilder(name);
        for (int i = 1; i < buf.length() - 1; i++) {
            if (Character.isLowerCase(buf.charAt(i - 1)) &&
                    Character.isUpperCase(buf.charAt(i)) &&
                    Character.isLowerCase(buf.charAt(i + 1))) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toLowerCase(Locale.ROOT);
    }
}

हम अपने db नामकरण सम्मेलन को लागू करने के लिए toPhysicalTableName और toPhysicalColumnName तरीकों के डिफ़ॉल्ट व्यवहार को ओवरराइड कर रहे हैं।

हमारे कस्टम कार्यान्वयन का उपयोग करने के लिए हमें hibernate.physical_naming_strategy संपत्ति को परिभाषित करने और इसे हमारे PhysicalNamingStrategyImpl वर्ग का नाम देने की आवश्यकता है।

hibernate.physical_naming_strategy=com.example.foo.bar.PhysicalNamingStrategyImpl

इस तरह हम अपने कोड को @Table और @Column एनोटेशन से @Table सकते हैं, इसलिए हमारी इकाई वर्ग:

@Entity
public class ApplicationEventLog {
    private Date startTimestamp;
    private String logUser;
    private Integer eventSuccess;

    @Column(name="finish_dtl")
    private String finishDetails;
}

सही ढंग से db टेबल पर मैप किया जाएगा:

CREATE TABLE application_event_log (
  ...
  start_timestamp timestamp,
  log_user varchar(255),
  event_success int(11),
  finish_dtl varchar(2000),
  ...
)

जैसा कि ऊपर दिए गए उदाहरण में देखा गया है, हम अभी भी db ऑब्जेक्ट के नाम को स्पष्ट रूप से बता सकते हैं यदि ऐसा नहीं है, तो किसी कारण से, हमारे सामान्य नामकरण सम्मेलन के अनुसार: @Column(name="finish_dtl")



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow