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 데이터 유형 인 Binary Large Object가 있습니다. 또는 오히려 두 가지가 있습니다.
- 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;
// ...
}
주석은 Large Object가@Lob
필드에 저장되어 있음 을 Hibernate에게 알려줍니다 . 그리고 이미 모든 것을 데이터베이스에 저장하는 방법에 대해 이야기했습니다.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
Hibernate는 JSON을 데이터 유형으로 흥미롭게 지원합니다. 문자열의 HashMap을 단일 JSON 개체로 저장할 수 있습니다. DBMS가 JSON과 함께 작동할 수 있는 경우 다음과 같습니다.
@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;
Hibernate는 유형 객체가 Map<String, String>
단일 JSON 객체로 직렬화되도록 관리합니다. 또한 데이터베이스에서 객체를 읽을 때 JSON 객체를 Map<String, String>
.
Hibernate는 XML로 비슷한 것을 할 수 있습니다:
@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;
GO TO FULL VERSION