Поиск сложного объекта JPA для вложенного объекта по его значению - PullRequest
0 голосов
/ 14 февраля 2019

Предположим, у нас есть сложное отношение JPA, часть которого выглядит следующим образом:

@MappedSuperclass
public class DiffEntity {

  private String diffId;

  public DiffEntity() {
    this.diffId = UUID.randomUUID().toString();
  }
  //...
}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class ParentEntity extends DiffEntity {

  @Id
  @GeneratedValue
  private long id;

  @Column
  private String name;

 //...
}

@Entity
public class Construct extends ParentEntity {

  @Column
  private String variable;

  @OneToMany(mappedBy = "construct", cascade = CascadeType.ALL)
  private List<Partconstruct> partconstructs;

 //...

 }

@Entity
public class Partconstruct extends ParentEntity {

  @OneToMany(mappedBy = "partconstruct", cascade = CascadeType.ALL)
  private List<Field> fields;

  @OneToMany(mappedBy = "partconstruct", cascade = CascadeType.ALL)
  private List<Hardparameter> hardparameters;

  @ManyToOne
  @JoinColumn(name = "construct_id")
  private Construct construct;

  //...
}

@Entity
public class Field extends ParentEntity {

  @Column
  private int fieldSize;

  @ManyToOne
  @JoinColumn(name = "partconstruct_id")
  private Partconstruct partconstruct;

  //...
}

@Entity
public class Hardparameter extends ParentEntity {

  @Column
  private String value;

  @ManyToOne
  @JoinColumn(name = "partConstruct_Id")
  private Partconstruct partConstruct;

  //...
}

Мы имеем дело с объектами типа Construct.Construct глубоко клонируется и сохраняется, все его вложенные объекты на графе объектов также клонируются и получают новый Id (первичный ключ).На каждом клоне diffId (из DiffEntity сущности) остается тем же самым (оно служит для корреляции объектов для отличительного признака).

Как можно было бы искать и получать ссылку дляспецифические DiffEntity, учитывая, что у нас есть следующее:

  • ссылка на Construnct экземпляр
  • тип вложенного объекта
  • diffId мы после.

Я пробовал разные версии траверсов графов объектов с отражением, которые будут работать для небольшого по размеру Construct объекта, но когда он станет слишком большим, производительность будет очень низкой.

Есть ли какая-то магия у самого менеджера сущностей для достижения этой цели?

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