Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Это от раздела 10.7. Автоматическое обнаружение состояния из Быть в спящем режиме Справочной документации:
saveOrUpdate () делает следующее:
- , если объект является уже персистентным на этой сессии, ничего не сделайте
- , если другой объект, связанный с сессией, имеет тот же идентификатор, выдайте исключение
- , если объект не имеет никакого свойства идентификатора, сохраните () его
- , если идентификатору объекта присвоили значение недавно инстанцированному объекту, сохраните () его
- , если объект является имеющим версию (< version> или < timestamp>), и значение свойства версии то же значение, присвоенное недавно инстанцированному объекту, сохраните () его
- иначе обновление (), объект
и слияние () очень отличается:
- , если существует персистентный экземпляр с тем же идентификатором, в настоящее время связываемым с сессией, скопируйте состояние данного объекта на персистентный экземпляр
- , если нет никакого персистентного экземпляра, в настоящее время связываемого с сессией, попытайтесь загрузить его из базы данных или создать новый персистентный экземпляр
- , персистентный экземпляр возвращается
- , приведенный пример не становится связанным с сессией, это остается отдельным
, необходимо использовать Слияние (), при попытке обновить объекты, которые были однажды отсоединены от сессии, особенно если могли бы быть персистентные экземпляры тех объектов, в настоящее время связываемых с сессией. Иначе использование SaveOrUpdate () в этом случае привело бы к исключению.
Насколько я понимаю, merge()
возьмет объект, который не может быть связан с текущей сессией и скопировать ее состояние (значения свойств, и т.д.) к объекту, который является связан с текущей сессией (с тем же значением/идентификатором PK, конечно).
saveOrUpdate()
будет звонить , Сохраняют или Обновление на Вашей сессии, на основе значения идентификационных данных данного объекта.