обновление кэшированной коллекции спящего режима [дубликат]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
11
задан beerbajay 19 December 2011 в 12:16
поделиться

5 ответов

Самый короткий ответ кажется вам невозможен, и это имеет смысл. В двунаправленной связи «многие-ко-многим» одна сторона должна быть главной и используется для сохранения изменений в базовой таблице соединений. Поскольку JPA не будет поддерживать обе стороны ассоциации, вы можете столкнуться с ситуацией памяти, которую невозможно перезагрузить после сохранения в базе данных. Пример:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

Если это состояние может быть сохранено, в таблице соединений вы получите следующие записи:

a1_id, b_id
a2_id, b_id

Но после загрузки, как JPA знает что вы намеревались сообщить b только о a2, а не a1? и что относительно a2, который не должен знать о b?

Вот почему вы должны поддерживать двунаправленную связь самостоятельно (и сделать вышеприведенный пример невозможным для достижения, даже в памяти), и JPA будет сохраняться только на основе на состояние одной его стороны.

16
ответ дан Louis Jacomet 27 August 2018 в 05:24
поделиться

Вы указали столбцы обратного соединения?

@Entity
class A {
   @ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
   private List <B> b;
   ..
}

@Entity 
class B { 
   @ManyToMany 
   @JoinTable (
       name="A_B",
       joinColumns = {@JoinColumn(name="A_ID")},
       inverseJoinColumns = {@JoinColumn(name="B_ID")}
   )
   private List<A> a; 
   .. 
} 

Это предполагает таблицу соединений A_B с столбцами A_ID и B_ID.

3
ответ дан A_M 27 August 2018 в 05:24
поделиться

Возможно, в ответе A_M есть небольшая ошибка. По-моему, это должно быть:

   @Entity
   class B { 
   @ManyToMany 
   @JoinTable (
       name="A_B",
       joinColumns = {@JoinColumn(name="B_ID")},
       inverseJoinColumns = {@JoinColumn(name="A_ID")}
   )
   private List a; 
   .. 
}
0
ответ дан Jozeph 27 August 2018 в 05:24
поделиться

Вы пытались добавить параметр mappedBy в поле A в классе B, например

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL, mappedBy = "b")
   private List<A> a;
 ..
}
0
ответ дан mR_fr0g 27 August 2018 в 05:24
поделиться

Поскольку отношение двунаправлено, так как приложение обновляет одну сторону отношения, другая сторона также должна обновляться и быть в синхронизации. В JPA, как и в Java в целом, ответственность за приложение лежит на объекте или объектная модель для поддержания отношений. Если ваше приложение добавляет одну сторону отношения, то оно должно быть добавлено к другой стороне.

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

Источник: OneToMany # Getters_and_Setters

1
ответ дан Tomasz 27 August 2018 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: