Как разделить определенные свойства объекта и сохранить его в отдельной таблице и связать, используя идентификатор? - PullRequest
0 голосов
/ 30 октября 2019

Есть 2 объекта Document и DocumentData. Теперь, как я могу получить поле dataUUID , содержащее поле uuid , которое генерируется при сохранении байта [] с использованием сущности DocumentData.

@Entity(name = "DOCUMENT_DETAILS") 
public class Document extends BaseEntity {

   @OneToOne(targetEntity = DocumentData.class, casacade = Cascade.ALL)
   @JoinColumn(name = "DATA_UUID", foreignKey = @ForeignKey(name = "DATA_UUID_ID")
   private String dataUUID;

   @Column(name = "BACK_UP_NAME")
   private String backUpName;
}

@Entity(name = "DOCUMENT_DATA")
public class DocumentData {

  @Id
  @GeneratedValue(generator = "system-uuid")
  @GenericGenerator(name = "system-uuid", strategy = "uuid")
  private String uuid;

  @Column(name = "DATA")
  @Lob
  private byte[] data;

}

1 Ответ

0 голосов
/ 30 октября 2019

Каждая сущность должна иметь 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, а не независимой сущностью, однако я не буду вдаваться в подробности.

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