ссылка на идентификатор вместо использования внешнего ключа в jdo? - PullRequest
1 голос
/ 14 декабря 2010

Я использую Datanucleus (jdo) с дерби, и у меня есть класс MyClass.И этот класс имеет переменную типа AnotherClass.Я хочу сохранить эту переменную.Когда экземпляр MyClass сохраняется, переменная AnotherClass также сохраняется.

Теперь проблема: когда я сохраняю новый MyClass, и этот экземпляр имеет тот же экземпляр AnotherClass, что и переменная, в которую я не хочу сохранять егоснова таблицу AnotherClass, но просто укажите ее по идентификатору в таблице MyClass.Иначе в моей таблице AnotherClass будут сохранены тонны того же экземпляра.

В данный момент мой класс выглядит следующим образом:

  @PersistenceCapable(identityType = IdentityType.APPLICATION)
  public class MyClass implements Serializable {

  private static final long serialVersionUID = -5074030667922748006L;

  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  Long key;

  @Persistent
  AnotherClass anotherClass;

Обновление:

Класс AnotherClass выглядит следующим образом:класс MyClass.

Полагаю, ответ Тома Андерсона был уже правильным.Я создаю новые экземпляры AnotherClass и помещаю их в экземпляр MyClass, например myClass.setAnotherClass (anotherClass).Поэтому я предполагаю, что anotherClass - это экземпляр с теми же значениями, но он все еще не тот же, поэтому он получает свою собственную строку в базе данных, даже если он там выглядит абсолютно идентично (кроме идентификатора).

Так что япредположим, что решение будет таким: Проверьте, сохранился ли экземпляр AnotherClass в базе данных, если да, получите его из базы данных и установите для этого экземпляра myClass.Если нет: создайте новый экземпляр и установите для него myClass, чтобы он сохранялся при сохранении myClass.Это то, как я должен это делать?

РЕДАКТИРОВАТЬ: Хорошо, теперь у меня есть новая проблема: я больше не могу удалять экземпляры MyClass (= Character).Если я пытаюсь сделать это, я получаю следующее исключение (AnotherClass = Faction):

java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'FACTION' caused a violation of foreign key constraint 'CHARACTER_FK1' for key (1).  The statement has been rolled back.

Это просто произошло, когда я сделал это: создаю персонажа 1, создаю персонажа 2 точно такой же фракции (это только в базе данных один раз), попробуйте удалить персонаж2.Есть идеи, почему?

EDIT2: Забыл что-то важное:

  @Persistent(dependent = "true")
  Faction faction;

Так говорит мой класс персонажей.У меня есть это, потому что я хочу, чтобы фракция была удалена, если ни один персонаж не использует ее.Я полагаю, в этом проблема?Как я могу сделать это сейчас?

1 Ответ

0 голосов
/ 14 декабря 2010

Это должно просто работать.Если два экземпляра MyClass указывают на один и тот же экземпляр 1002 * AnotherClass, то в таблице AnotherClass будет одна запись, на которую ссылаются обе записи MyClass.

Если вы видите лотыиз записей AnotherClass это может быть только потому, что у вас есть много разных экземпляров во время выполнения.Как вы определяете личность AnotherClass?Как вы связываете экземпляры MyClass с экземплярами AnotherClass?

...