6.1 সার্ভারে ফাইল সংরক্ষণ করুন

কখনও কখনও বাইনারি বস্তু ডাটাবেসে সংরক্ষণ করা প্রয়োজন. উদাহরণস্বরূপ, ফাইল। যদি ফাইলটি বড় হয়, তবে এটি ডিস্কের একটি পৃথক ফোল্ডারে সংরক্ষণ করা এবং ডাটাবেসে এর পাথগুলি সংরক্ষণ করা সবচেয়ে যুক্তিসঙ্গত। উদাহরণ:

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

এবং ডাটাবেসে আমরা ফাইলের একটি আপেক্ষিক পথ সংরক্ষণ করি:

\12355\avatar.jpg

ডাটাবেসে একটি আপেক্ষিক পথ সংরক্ষণ করা সুবিধাজনক, যেহেতু এটি থেকে একটি URL পাওয়া সহজ:

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

আমরা শুধু সার্ভার নামের আপেক্ষিক পথ পেস্ট করেছি এবং আমরা সম্পন্ন করেছি।

6.2 ডাটাবেসে সরাসরি ছবি সংরক্ষণ করুন

যাইহোক, ছবিগুলি ছোট হলে, সেগুলি ডাটাবেসে সরাসরি সংরক্ষণ করা যেতে পারে এবং বাইটের সেট হিসাবে ক্লায়েন্টকে দেওয়া যেতে পারে। এই জাতীয় ক্ষেত্রে, এসকিউএল-এর একটি বিশেষ BLOB ডেটা টাইপ রয়েছে - বাইনারি লার্জ অবজেক্ট। অথবা বরং, তাদের মধ্যে এমনকি দুটি আছে:

  • CLOB - অক্ষর বড় বস্তু,
  • 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 XML এবং JSON

হাইবারনেটের ডেটা টাইপ হিসাবে JSON-এর জন্য আকর্ষণীয় সমর্থন রয়েছে। এটি আপনাকে একটি একক JSON অবজেক্ট হিসাবে স্ট্রিংগুলির একটি হ্যাশম্যাপ সংরক্ষণ করতে দেয়। যদি DBMS JSON এর সাথে কাজ করতে পারে, তাহলে এটি দেখতে এরকম হবে:

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

হাইবারনেট যত্ন নেয় যে টাইপ অবজেক্টটি Map<String, String>একটি একক JSON অবজেক্টে সিরিয়ালাইজ করা হয়। এছাড়াও, ডাটাবেস থেকে একটি বস্তু পড়ার সময়, এটি JSON অবজেক্টকে একটি সেটে পরিণত করে Map<String, String>

হাইবারনেট XML এর সাথে অনুরূপ কিছু করতে পারে:

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