6.1 फाइलों को सर्वर पर स्टोर करें

कभी-कभी बाइनरी ऑब्जेक्ट्स को डेटाबेस में सेव करने की आवश्यकता होती है। उदाहरण के लिए, फ़ाइलें। यदि फ़ाइल बड़ी है, तो इसे डिस्क पर एक अलग फ़ोल्डर में संग्रहीत करना और डेटाबेस में इसके पथों को संग्रहीत करना सबसे उचित है। उदाहरण:

c:\db-files\users\12355\avatar.jpg

और डेटाबेस में हम फ़ाइल के सापेक्ष पथ को संग्रहीत करते हैं:

\12355\avatar.jpg

डेटाबेस में एक सापेक्ष पथ को संग्रहीत करना सुविधाजनक है, क्योंकि इससे URL प्राप्त करना आसान है:

https://storage.codegym.cc/users/12355/avatar.jpg

हम बस सर्वर नाम के सापेक्ष पथ पेस्ट करते हैं और हमारा काम हो गया।

6.2 इमेज को सीधे डेटाबेस में स्टोर करें

हालाँकि, यदि चित्र छोटे हैं, तो उन्हें सीधे डेटाबेस में संग्रहीत किया जा सकता है और क्लाइंट को बाइट्स के सेट के रूप में दिया जा सकता है। ऐसे मामलों के लिए, SQL के पास एक विशेष BLOB डेटा प्रकार है - बाइनरी लार्ज ऑब्जेक्ट। या यों कहें, उनमें से दो भी हैं:

  • सीएलओबी - कैरेक्टर लार्ज ऑब्जेक्ट,
  • ब्लॉब - बाइनरी लार्ज ऑब्जेक्ट।

CLOB का उपयोग बहुत बड़े टेक्स्ट को स्टोर करने के लिए किया जाता है। एक BLOB बाइनरी डेटा, जैसे छोटे चित्र, वीडियो और पसंद को संग्रहीत करने के लिए है।

उदाहरण:

@Entity
@Table(name="user")
public class User {

    @Id
    private String id;

	@Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

	@Lob
	@Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;

	// ...
}

एनोटेशन @Lobहाइबरनेट को बताता है कि क्षेत्र में एक बड़ी वस्तु संग्रहीत है । और columnDefinition="BLOB"पहले से ही इस बारे में बात करता है कि इसे डेटाबेस में कैसे सहेजा जाए।

आइए एक उदाहरण कोड लिखें जो एक नए उपयोगकर्ता और उसकी तस्वीर को डेटाबेस में सहेजता है:

byte[] imageBuffer = Files.readAllBytes(Paths.get("C:/temp/avatar.png"))

User user = new User();
user.setId("1");
user.setName("Zapp");
user.setPhoto(imageBuffer);

session.persist(user);

6.3 एक्सएमएल और जेएसओएन

डेटा प्रकार के रूप में JSON के लिए हाइबरनेट के पास दिलचस्प समर्थन है। यह आपको स्ट्रिंग के हैश मैप को एक JSON ऑब्जेक्ट के रूप में स्टोर करने की अनुमति देता है। यदि DBMS JSON के साथ काम कर सकता है, तो ऐसा दिखता है:

@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;

हाइबरनेट इस बात का ध्यान रखता है कि टाइप ऑब्जेक्ट को Map<String, String>एक JSON ऑब्जेक्ट में क्रमबद्ध किया जाए। साथ ही, डेटाबेस से ऑब्जेक्ट पढ़ते समय, यह JSON ऑब्जेक्ट को सेट में बदल देता है Map<String, String>

हाइबरनेट एक्सएमएल के साथ कुछ ऐसा ही कर सकता है:

@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;