AppEngine: сохранение сирот в собственном двунаправленном отношении «один ко многим»

#google-app-engine #jpa #jdo

#google-app-engine #jpa #jdo

Вопрос:

У меня есть следующие две сущности:

 @Entity
public class SupermarketChain {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;

@OneToMany(mappedBy = "supermarketChain")
@Basic
private List<Supermarket> supermarkets;
}

@Entity
public class Supermarket {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;

@ManyToOne(optional=true)
private SupermarketChain supermarketChain;
}
  

Когда я удаляю родительский элемент с помощью em.remove(SupermarketChain.class , ключ), все сироты тоже будут удалены. Я прочитал соответствующий абзац в документации, даже попробовал его с помощью JDO с помощью @Element(dependent = «false»), но проблема остается. Как я могу сохранить сирот в этом отношении?

Ответ №1:

Сохранение сироты не имеет смысла. В версии v1 GAE JDO / JPA все отношения являются «принадлежащими», поэтому у вас должен быть родитель любого дочернего элемента. И если родительский элемент больше не существует, дочерний элемент удаляется. Всегда.

В версии v2 GAE JDO / JPA вы также сможете иметь объекты, не принадлежащие владельцам, следовательно, «родительского» объекта нет, и поэтому они могут продолжать существовать после.

Комментарии:

1. Сохранение (или создание) сирот имеет смысл в App Engine. Наличие 2 объектов, у которых есть общий родительский элемент, даже если этот родительский элемент не существует, — это то, как вы помещаете вещи в одну и ту же группу объектов — имея воображаемый объект, который является родительским для них обоих. Это тот случай, когда семантика JDO и семантика App Engine отличаются настолько, что, я думаю, вызывают некоторую путаницу. Не совсем справедливо говорить, что «сохранение сироты не имеет смысла».

2. Понятия не имею, в чем разница, на которую вы ссылаетесь, между «семантикой JDO» и «семантикой AppEngine». JDO просто определяет API. Это не требует удаления или иным образом, когда нет родительского ключа (поскольку он также ничего не требует о родительских ключах). Логика, описанная (мной выше), — это то, что сотрудники GAE воплотили в своем плагине JDO (как то, что имело смысл).