==
выполняет контрольную проверку равенства, ссылаясь на то, что 2 объекта (строки в этом случае) относятся к одному и тому же объекту в памяти.
Метод equals()
будет проверять, будет ли содержимое или состояния двух объектов одинаковы.
Очевидно, что ==
работает быстрее, но во многих случаях может (может) давать ложные результаты, если вы просто хотите сказать, имеет ли 2 String
s тот же текст.
Определенно рекомендуется использовать метод equals()
.
Не беспокойтесь о производительности. Некоторые способы поощрения использования String.equals()
:
String.equals()
сначала проверяет ссылочное равенство (используя ==
), и если две строки одинаковы по ссылке, дальнейший расчет Выполняется! String.equals()
будет проверять длину строк. Это также является быстрой операцией, поскольку класс String
хранит длину строки, не нужно считать символы или кодовые точки. Если длины отличаются, дальнейшая проверка не выполняется, мы знаем, что они не могут быть равными. Когда все сказано и даже если у нас есть гарантия, что строки являются стажерами, использование метода equals()
все еще не является издержками, которые можно было бы подумать, определенно рекомендуемым способом. Если вам нужна эффективная проверка ссылок, используйте перечисления, где гарантируется спецификацией и реализацией языка, что одно и то же значение перечисления будет одним и тем же объектом (по ссылке).
Эта функция была добавлена в JPA 2.0. Просто позвоните:
Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);
Прочтите статью о Универсальном подходе Дао .
Я не совсем понимаю вашу проблему, но если вы хотите получить идентификатор объекта - просто получите его. Он доступен после завершения метода persist, т.е.
em.persist(entity);
et.commit();
int id = entity.getId()
Я обычно создаю класс AbstractEntity
с полем id
и его методами доступа и наследую все остальные объекты от этого класса.
Единственная проблема с этим подходом заключается в том, что если вам нужно сделать какую-либо из ваших сущностей сериализуемыми, вам придется сделать AbstractEntity
сериализуемыми, т.е. все остальные сущности станут сериализуемыми. В противном случае поле id
не будет сериализовано в сущности, которая должна быть сериализуемой.
Подход с общим интерфейсом - это то, что я использую, и он отлично работает. Используя чистый JPA, я не вижу способа получить идентификатор.
Посмотрите на merge()
. Я сам не часто использовал его, но думаю, что
Hibernate имеет способы сделать это
Serializable id = session.getIdentifier(entity);
Но это не стандарт JPA.