Лучший способ отобразить большое поле (byte []) в Hibernate - PullRequest
0 голосов
/ 03 марта 2020

У меня есть объектная модель, в которой я хочу хранить информацию о RTU и прошивках, на которых они работают. Мне нужно хранить прошивки в байтовом массиве в базе данных, чтобы можно было переустановить прошивку удаленно. Мой первый подход был примерно таким:

RTU
---
rtuId int (PK)
firmwareId int (FK)
.
.
.

Firmware
--------
firmwareId int (PK)
code int
firmware byte[]
.
.
.

public class Rtus {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "rtuid")
    private long rtuId;

    @JoinColumn(name = "firmwareid", referencedColumnName = "firmwareid")
    @ManyToOne(fetch = FetchType.LAZY, optional = true)
    private Firmwares firmware;

    @Transient
    private Integer firmwareId;

    .
    .
    .

}

public class Firmwares implements Serializable, Cloneable {

    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "firmwareid")
    private Integer firmwareId;   

    @Basic(optional = false)
    @Column(name = "firmware")
    private byte[] firmware;

    @Basic(optional = false)
    @Column(name = "code", unique = true)
    private int code;   


    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "firmware")
    @JsonIgnore
    private Collection<Rtus> rtuCollection;

    .
    .
    .
}

Проблема здесь заключалась в том, что при извлечении объекта RTU в большинстве случаев необходимо включать код прошивки, поэтому для каждого полученного объекта я нужно явно получить объект Firmware тоже. Этот объект содержит большой байтовый массив, поэтому эта загрузка будет занимать много памяти.

Таким образом, мой текущий подход состоит в том, чтобы отделить байтовый массив от основного объекта в новый, используя отношение @OneToOne, и загружайте его только тогда, когда необходимо отправить его:

Firmware
--------
firmwareId int (PK)
code int
.
.
.

FirmwareBinary
--------------
firmwareId int (PFK)
firmware byte[]

Я провел некоторое исследование, и кажется, что вы не можете лениво выбрать родительскую сторону двунаправленной ассоциации @OneToOne, даже если указали FetchType.LAZY, поэтому у меня возникла та же проблема, что и раньше.

Какова наиболее распространенная схема для реализации такого рода случаев, когда у вас действительно большое поле, которое вы хотите отделить от остальной части объекта, и загрузить в память только тогда, когда это явно необходимо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...