Как использовать @Id со строковым типом в JPA/Hibernate?
У меня есть одна сущность, которая содержит первичный ключ строки типа. Эта модель объекта выглядит следующим образом:
@Entity
public class MyEntity {
@Id
@Column(name="PR_KEY", unique=true)
private String prKey;
....
....
}
Но я столкнулся с проблемой, говорящей о TypeMismatch.
org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class java.lang.String, got class java.lang.Long
Ответы
Ответ 1
Если вы не укажете стратегию генерации идентификатора, Hibernate будет использовать GenerationType.AUTO
. Это приведет к любому из
AUTO - идентификационный столбец, последовательность или таблица в зависимости от базовая БД.
Если вы посмотрите здесь, вы заметите, что все из них генерируют идентификаторы типа long
, short
или int
, а не типа String
.
Предположим, что вам нужен идентификатор UIID String
в качестве идентификатора, вы можете использовать
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "PR_KEY")
private String prKey;
Ответ 2
Проверьте тип данных PR_KEY в таблице базы данных. Эта проблема может возникнуть, если столбец имеет тип Number, и вы пытаетесь сопоставить его с String в своей сущности.
То же самое относится к coulmn сгенерированными идентификаторами.
Ответ 3
Когда String используется как id, тот же тип должен использоваться также при поиске объекта через Session/EntityManager:
Вместо предоставления Long:
Long key = 1L;
MyEntity me = session.get(MyEntity.class, key);
//or
MyEntity me = entityManager.find(MyEntity.class, key);
Строка должна быть указана:
String key = "1";
MyEntity me = session.get(MyEntity.class, key);
//or
MyEntity me = entityManager.find(MyEntity.class, key);