У меня есть объектная модель, в которой я хочу хранить информацию о 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
, поэтому у меня возникла та же проблема, что и раньше.
Какова наиболее распространенная схема для реализации такого рода случаев, когда у вас действительно большое поле, которое вы хотите отделить от остальной части объекта, и загрузить в память только тогда, когда это явно необходимо?