6.1 Lagra filer på servern

Ibland måste binära objekt sparas i databasen. Till exempel filer. Om filen är stor är det mest rimligt att lagra den i en separat mapp på disken och lagra dess sökvägar i databasen. Exempel:

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

Och i databasen lagrar vi bara en relativ sökväg till filen:

\12355\avatar.jpg

Det är bekvämt att lagra en relativ sökväg i databasen, eftersom det då är lätt att få en URL från den:

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

Vi klistrar bara in den relativa sökvägen till servernamnet och vi är klara.

6.2 Lagra bilder direkt i databasen

Men om bilderna är små kan de lagras direkt i databasen och ges till klienten som en uppsättning byte. För sådana fall har SQL en speciell BLOB- datatyp - Binary Large Object. Eller snarare, det finns till och med två av dem:

  • CLOB - Character Large Object,
  • BLOB - binärt stort objekt.

CLOB används för att lagra mycket stora texter. En BLOB är för att lagra binär data, såsom små bilder, videor och liknande.

Exempel:

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

	// ...
}

Anteckningen @Lobtalar om för Hibernate att ett stort objekt lagras i fältet . Och columnDefinition="BLOB"pratar redan om hur man sparar allt i databasen.

Låt oss skriva en exempelkod som sparar en ny användare och hans foto till databasen:

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

Hibernate har intressant stöd för JSON som datatyp. Det låter dig lagra en HashMap av strängar som ett enda JSON-objekt. Om DBMS kan fungera med JSON, ser det ut så här:

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

Hibernate ser till att typobjektet Map<String, String>serialiseras till ett enda JSON-objekt. När man läser ett objekt från databasen, förvandlas JSON-objektet till en uppsättning av Map<String, String>.

Hibernate kan göra något liknande med XML:

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