Каждая сущность должна иметь Id
. Document
нет. Поэтому вы должны сообщить своему провайдеру JPA, что одна сторона зависит от другой в отношении своей идентичности: обычно именуемой OneToOne
с общим первичным ключом.
Для этого необходимо установить двусторонние отношения. и добавьте аннотацию Id
к взаимосвязи.
Мне представляется более целесообразным иметь DocumentData в качестве зависимой сущности:
@Entity(name = "DOCUMENT_DETAILS")
public class Document {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "DATA_UUID")
private String dataUUID;
@Column(name = "BACK_UP_NAME")
private String backUpName;
@OneToOne(mappedBy = "document");
private DocumentData data;
}
@Entity(name = "DOCUMENT_DATA")
public class DocumentData {
@Id //depends on Document for its ID
@OneToOne
@JoinColumn(name = "DATA_UUID", foreignKey = @ForeignKey(name = "DATA_UUID_ID")
private Document document;
@Column(name = "DATA")
@Lob
private byte[] data;
}
При сохранении необходимо убедиться, что обастороны отношения установлены правильно:
Имеет смысл инкапсулировать это в установщик в Document:
public void setData(DocumentData data){
this.data = data;
data.setDocument(this);
}
Тогда:
Document doc = new Document();
DocumentData data = new DocumentData();
doc.setData(data);
//save
Есть другое решениегде DocumentData
может быть Embeddable
, а не независимой сущностью, однако я не буду вдаваться в подробности.