исключение jpa IllegalArgumentException - PullRequest
0 голосов
/ 22 апреля 2010

в моем проекте три класса сущностей

public class Blobx {
@ManyToOne
private Userx user;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key id;
}

public class Index  {
@Id
private String keyword;
@OneToMany(cascade = CascadeType.PERSIST)
private List<Blobx> blobs;
}

public class Userx  {
@Id
private String name;  
@OneToMany(mappedBy = "user")
private List<Blobx>blobs;
}

при запуске следующих строк движок приложения выдает исключение

    em.getTransaction().begin();
    em.persist(index);
    em.getTransaction().commit();//exception is thrown
    em.close();

в

Caused by: java.lang.IllegalArgumentException: can't operate on multiple entity groups in a single transaction. found both Element 


{
    type: "Index"
   name: "function"
  }
  and Element {
    type: "Userx"
    name: "18580476422013912411"
  }

Я не могу понять, что не так?

1 Ответ

1 голос
/ 22 апреля 2010

Что происходит (на основе сообщения об ошибке), что вы пытаетесь сохранить в транзакции Index, который содержит Blobx, которые содержат Userx, которые находятся в разных группах сущностей, в транзакции , Когда вы звоните em.persist(index), он будет каскадно сохранять все сущности внутри него, и все те, кто внутри них.

Думайте о группе сущностей как о кластере машин. Некоторые из ваших Index находятся в кластере А в штате Невада. Blobx, содержащиеся в них, находятся в кластере B, в штате Мэн, а Userx, содержащиеся в них, находятся в кластерах B и C, в Техасе и Орегоне. То, как они все оказались там, совершенно случайно, и (с вашим кодом, как он есть) полностью вне вашего контроля. Просить App Engine сохранить все эти географически несопоставимые объекты и узнать, когда происходит сбой (т. Е. В транзакции), практически невозможно, и потребовалось бы множество сетевых перекрестных разговоров, чтобы все стороны знали, что все другие стороны в порядке. Так что это не разрешено.

Что вы хотите сделать, так это убедиться, что Google объединяет все ваши объекты в одну группу объектов, что означает, что все они находятся в одном (географическом) месте. Для этого прочитайте документы по транзакциям , в которых описано, как убедиться, что ваши сущности окажутся в одной и той же группе сущностей, а это значит, что они смогут обработать транзакцию для всех них.

Теперь, у группирующих сущность вещей есть свои недостатки. А именно медлительность и неравномерное использование хранилища данных (например, теперь, когда все ваши сущности будут в Техасе, пользователи в Орегоне увидят ненужную медлительность!), Поэтому используйте группы сущностей только в том случае, если вам абсолютно необходимо использовать транзакции для всех сущностей. Например, не используйте каскадное сохранение, если только вам это не нужно, или не делайте это в транзакции, если вам не нужно.

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