6.1 Mag-imbak ng mga file sa server

Minsan ang mga binary na bagay ay kailangang i-save sa database. Halimbawa, mga file. Kung ang file ay malaki, kung gayon ito ay pinaka-makatwirang iimbak ito sa isang hiwalay na folder sa disk, at iimbak ang mga landas nito sa database. Halimbawa:

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

At sa database ay nag-iimbak lamang kami ng isang kamag-anak na landas sa file:

\12355\avatar.jpg

Maginhawang mag-imbak ng kamag-anak na landas sa database, dahil madaling makakuha ng URL mula rito:

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

I-paste lang namin ang kamag-anak na landas sa pangalan ng server at tapos na kami.

6.2 Direktang mag-imbak ng mga larawan sa database

Gayunpaman, kung ang mga larawan ay maliit, maaari silang maimbak nang direkta sa database at ibigay sa kliyente bilang isang set ng mga byte. Para sa mga ganitong kaso, ang SQL ay may espesyal na uri ng data ng BLOB - Binary Large Object. O sa halip, mayroon pa ngang dalawa sa kanila:

  • CLOB - Character na Malaking Bagay,
  • BLOB - Binary Malaking Bagay.

Ang CLOB ay ginagamit upang mag-imbak ng napakalaking teksto. Ang BLOB ay para sa pag-iimbak ng binary data, tulad ng maliliit na larawan, video, at iba pa.

Halimbawa:

@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;

	// ...
}

Ang anotasyon @Lobay nagsasabi sa Hibernate na ang isang Malaking Bagay ay nakaimbak sa field . At columnDefinition="BLOB"napag-usapan na kung paano i-save ang lahat ng ito sa database.

Sumulat tayo ng isang halimbawang code na nagse-save ng isang bagong user at ang kanyang larawan sa database:

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 at JSON

Ang hibernate ay may kawili-wiling suporta para sa JSON bilang isang uri ng data. Pinapayagan ka nitong mag-imbak ng isang HashMap ng mga string bilang isang JSON object. Kung ang DBMS ay maaaring gumana sa JSON, ganito ang hitsura nito:

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

Ang hibernate ay nangangalaga na ang uri ng object Map<String, String>ay naka-serialize sa isang JSON object. Gayundin, kapag nagbabasa ng isang bagay mula sa database, ginagawa nitong isang set ng Map<String, String>.

Ang hibernate ay maaaring gumawa ng isang bagay na katulad sa XML:

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