Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена в нуль (т. е. она не ссылалась на экземпляр фактического объекта).
Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для 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
}
Самый короткий ответ кажется вам невозможен, и это имеет смысл. В двунаправленной связи «многие-ко-многим» одна сторона должна быть главной и используется для сохранения изменений в базовой таблице соединений. Поскольку 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 будет сохраняться только на основе на состояние одной его стороны.
Вы указали столбцы обратного соединения?
@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.
Возможно, в ответе A_M есть небольшая ошибка. По-моему, это должно быть:
@Entity class B { @ManyToMany @JoinTable ( name="A_B", joinColumns = {@JoinColumn(name="B_ID")}, inverseJoinColumns = {@JoinColumn(name="A_ID")} ) private List a; .. }
Вы пытались добавить параметр mappedBy в поле A в классе B, например
@Entity
class B {
@ManyToMany(cascade=CascadeType.ALL, mappedBy = "b")
private List<A> a;
..
}
Поскольку отношение двунаправлено, так как приложение обновляет одну сторону отношения, другая сторона также должна обновляться и быть в синхронизации. В JPA, как и в Java в целом, ответственность за приложение лежит на объекте или объектная модель для поддержания отношений. Если ваше приложение добавляет одну сторону отношения, то оно должно быть добавлено к другой стороне.
Это можно разрешить с помощью добавления или установки методов в объектной модели, которые обрабатывают обе стороны отношений, поэтому код приложения не должен беспокоиться об этом. Есть два способа сделать это: вы можете либо добавить код обслуживания отношений в одну сторону отношений, и использовать только установочный инструмент с одной стороны (например, защитить другую сторону) или добавить его с обеих сторон и убедитесь, что вы избегаете бесконечного цикла.
blockquote>Источник: OneToMany # Getters_and_Setters