#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 (как то, что имело смысл).