मुझे एक और समाधान मिला है जो आपके @Column
. में MySQL कॉलम डेफिनिशन स्निपेट को हार्डकोड नहीं करने देता है एनोटेशन। org.hibernate.dialect.MySQLDialect
को ओवरराइड करके अपनी खुद की हाइबरनेट बोली परिभाषित करें :
package org.yourproject;
import java.sql.Types;
import org.hibernate.dialect.MySQL5Dialect;
public class MySQL564PlusDialect extends MySQL5Dialect {
public MySQL564PlusDialect() {
super();
registerColumnType( Types.TIMESTAMP, 6, "datetime($l)" );
}
}
और इसे हाइबरनेट संपत्ति के रूप में निर्दिष्ट करें hibernate.dialect=org.yourproject.MySQL564PlusDialect
(जिस बोली को आप विस्तारित करना चाहते हैं वह भिन्न हो सकती है, जैसे org.hibernate.dialect.MySQL5InnoDBDialect
इसके बजाय)।
अब आप अपने DATETIME
. की सटीकता को समायोजित कर सकते हैं @Column
. के भीतर से length
. का उपयोग करके एनोटेशन विशेषता:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
जो DATETIME(3)
produce उत्पन्न करेगा कॉलम परिभाषा का अर्थ मिलीसेकंड सटीक है। यदि आपको सरल DATETIME
की आवश्यकता है (कोई भिन्नात्मक सेकंड नहीं), बस लंबाई निर्दिष्ट न करें। आप length
. के मान का उपयोग कर सकते हैं 6 तक जिसका मतलब माइक्रोसेकंड सटीक होगा।
यदि आप उपरोक्त बोली से भिन्न बोली का उपयोग करते हैं (उदाहरण के लिए मानक org.hibernate.dialect.MySQLDialect
या शायद कोई अन्य डेटाबेस), जो आपके कोड को नहीं तोड़ेगा:length
@Column
. पर विशेषता अनदेखा कर दिया जाएगा।
पी.एस. precision
. का फायदा उठाना ज्यादा समझदारी भरा होगा @Column
. की विशेषता length
. के बजाय , लेकिन "datetime($l)"
. का सरल प्रतिस्थापन "datetime($p)"
. के साथ पैटर्न मेरी अपनी बोली कार्यान्वयन में से एक काम नहीं करता है।