==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Во-первых, нулевой указатель возникает, потому что у вас есть поле entityManagerFactory
, которое вы никогда не инициализируете, и, таким образом, оно имеет значение null, но вы вызываете entityManagerFactory.createEntityManager()
(таким образом, это вызов null.createEntityManager()
) при инициализации поля entityManager
.
Вы могли бы попытаться поместить @Autowired
аннотацию над entityManagerFactory
- но я не понимаю, почему вы не проводите entityManager
с помощью Autowire, предоставленной Spring, а вместо этого создаете свою собственную.
Также, похоже, у вас есть @PersistenceContext
аннотация на entityManager
- эта должна внедрить существующую entityManager
в случае, если вы работаете внутри контейнера EJB или используете CDI для внедрения зависимостей, я думаю - но вы этого не делаете , вы используете аннотацию @Repository
, пришедшую из Spring. И вы сами инициализируете поле. Эту аннотацию обязательно нужно удалить (я полагаю, что вы положили ее туда, чтобы добавить entityManager
, но когда это не сработало, вы добавили код инициализации - entityManagerFactory.createEntityManager()
). Или лучше - заменить на @Autowire
, и вместо этого код инициализации должен быть удален.
например. просто есть
@Repository
public class CustomerInsertRepository {
@Autowired
private EntityManager entityManager;
...
Вероятно, метод createEntityManager () является статическим
. Попробуйте:
@PersistenceContext
private EntityManager entityManager =
EntityManagerFactory.createEntityManager();
Instaead
@PersistenceContext
private EntityManager entityManager =
entityManagerFactory.createEntityManager();
.