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;