hibernate
कस्टम नामकरण की रणनीति
खोज…
एक कस्टम 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")