Подтвердить что ты не робот

Как использовать @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
4b9b3361

Ответ 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);