JPA: मैं स्ट्रिंग को डेटाबेस फ़ील्ड में कैसे जारी रख सकता हूं, MYSQL टेक्स्ट टाइप करें


83

आवश्यकता यह है कि उपयोगकर्ता एक लेख लिख सकता है, इसलिए मैं mysql डेटाबेस के अंदर फ़ील्ड के Textलिए प्रकार चुनता हूं content। में कैसे रूपांतरित Java Stringहो सकता हूँMySQL Text

हेयर यू गो Jim Tough

@Entity
public class Article implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long userId;

    private String title;

    private String content;

    private Integer vote;

    //Constructors, setters, getters, equals and hashcode
}

मेरे MYSQL डेटाबेस में, contentटाइप है Text। मैं उम्मीद कर रहा था कि ऐसा कुछ होगा java.sql.Text, क्योंकि java.sql.Blobयह एक वास्तविक प्रकार है, लेकिन दुख की बात है कि इसका कोई अस्तित्व नहीं है

जवाबों:


132

चूंकि आप JPA का उपयोग कर रहे हैं, इसलिए Lobएनोटेशन (और वैकल्पिक रूप से Columnएनोटेशन) का उपयोग करें। जेपीए विनिर्देश इसके बारे में क्या कहता है:

9.1.19 लोब एनोटेशन

एक Lobएनोटेशन निर्दिष्ट करता है कि डेटाबेस-समर्थित बड़ी ऑब्जेक्ट प्रकार के लिए एक निरंतर संपत्ति या फ़ील्ड को एक बड़ी वस्तु के रूप में जारी रखा जाना चाहिए। पोर्टेबल अनुप्रयोगों को Lobडेटाबेस लॉब प्रकार में मैपिंग करते समय एनोटेशन का उपयोग करना चाहिए । लॉब एनोटेशन का उपयोग Basicएनोटेशन के साथ संयोजन में किया जा सकता है । एक लोब या तो एक द्विआधारी या चरित्र प्रकार हो सकता है। लोब प्रकार निरंतर क्षेत्र या संपत्ति के प्रकार से, और स्ट्रिंग और चरित्र-आधारित प्रकारों को छोड़कर बूँद से अलग है।

तो कुछ इस तरह से घोषित करें:

@Lob 
@Column(name="CONTENT", length=512)
private String content;

संदर्भ

  • जेपीए 1.0 विनिर्देश:
    • धारा 9.1.19 "लोब एनोटेशन"

25
हाइबरनेट JPA MYSQL पर, स्ट्रिंग क्षेत्र पर @Lobप्लस @Columnएनोटेशन का उपयोग करने से "गलत कॉलम प्रकार, अपेक्षित लॉन्गटेक्स्ट लेकिन कॉलम प्रकार टेक्स्ट होता है"। लेकिन समस्या का समाधान तब किया जाता है जब मैंने प्रयोग किया था@Column(columnDefinition = "text")
gerrytan

4
संयोजन में भावना क्या है @Lobऔर @Column(length=512)? सिर्फ खुश क्यों नहीं @Lob? हाइबरनेट JPA MySQL का उपयोग करते समय दोनों में कोई अंतर नहीं है। दोनों का परिणाम MySQL फ़ील्ड प्रकार में है longtext
सुकरात

मेरे पास एक बाइनरी कॉलम प्रकार था, और @Lobएनोटेशन मेरे लिए काम नहीं करता था। हालांकि, @Column(length=8192)महान काम किया और मेरी समस्या को हल किया।
यानि

110

साथ @Lobमैं हमेशा एक साथ अंत LONGTEXTMySQL में।

TEXTमैं इसे इस तरह से घोषित करने के लिए (JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text

इसे बेहतर खोजें, क्योंकि मैं सीधे चुन सकता हूं कि कौन सा टेक्स्ट-टाइप कॉलम डेटाबेस में होगा।

के लिए columnDefinitionपढ़ने के लिए यह भी अच्छा है यह

संपादित करें: कृपया एडम सेमन्स टिप्पणी पर ध्यान दें और आवेदन करने से पहले आपके द्वारा उपयोग किए जा रहे डेटाबेस इंजन की जांच करें columnDefinition = "TEXT"


4
यह एक अच्छा समाधान नहीं है, क्योंकि TEXT डेटा कॉलम सभी डेटाबेस इंजनों में उपलब्ध नहीं है, उदाहरण के लिए HSQLDB, विवरण: stackoverflow.com/questions/4213782/…
एडम सेयन

1
यह वही है जो मैं चाहता था क्योंकि यह वह है जो सभी उत्पादन डेटाबेस में उपलब्ध है, और जब मैं इसे नहीं चाहता तो "लोंगटेक्स्ट" के साथ समस्या नहीं है।
निकोलस डीपियाजा

29

mysql 'पाठ' के लिए:

@Column(columnDefinition = "TEXT")
private String description;

mysql 'longtext' के लिए:

@Lob
private String description;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.