Найдены общие ссылки на коллекцию: пустые коллекции OneToMany, ссылающиеся на тот же PersistentBag - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть следующая модель: Organization имеет List<Contract>, каждый Contract может иметь pricebookId и коллекцию PricebookEntry. Несколько Contract сущностей могут иметь одинаковые pricebookId. Collection<PricebookEntry> является результатом @OneToMany связи с pricebookId как JoinColumn.

Вот постулат: Организация имеет 2 контракта, а оба контракта не имеют pricebookId .

И вот моя проблема: во время сеанса Hibernate, в котором участвует данная конкретная организация, Hibernate выдает следующее исключение: org.hibernate.HibernateException: Found shared references to a collection: Contract.pricebookEntries.

Действительно, оба контракта имеют pricebookEntries установить то же самое PersistentBag (та же ссылка).

Как я могу это исправить?

Спасибо за вашу помощь!

@Entity
public class Organization implements Serializable {

  @Id
  private String id;

  @Fetch(FetchMode.SUBSELECT)
  @OneToMany(fetch = FetchType.EAGER, mappedBy = "organization")
  private final List<Contract> contracts = new ArrayList<>();

}


@Entity
public class Contract implements Serializable {

  @Id
  private String id;

  @Column(name = "pricebook_id")
  private String pricebookId;

  @JoinColumn(name = "organization_id", referencedColumnName = "id")
  @ManyToOne(fetch = FetchType.LAZY)
  private Organization organization;

  @JoinColumn(name="pricebookId", referencedColumnName = "pricebook_id")
  @OneToMany(fetch = FetchType.EAGER)
  @Fetch(FetchMode.SUBSELECT)
  private final Collection<PricebookEntry> pricebookEntries = new ArrayList<>();

}

@Entity
public class PricebookEntry {

  @Id
  private String id;

  private String pricebookId;

}

1 Ответ

1 голос
/ 28 февраля 2020

То, что вы здесь имеете, не является отношением @OneToMany, поскольку несколько Contract сущностей могут ссылаться на один и тот же (набор) из PricebookEntry экземпляров.

Чтобы исправить, превратите Collection<PricebookEntry> в собственная сущность Pricebook и имеет отношение многие-к-одному от Contract до Pricebook. Также потеряйте лишний pricebookid, поскольку это просто идентификатор Pricebook.

...