Исключение при попытке преобразовать атрибут UUID (внешний ключ) в объект Entity (решено) - PullRequest
1 голос
/ 18 июня 2019

Я разрабатываю приложение для начальной загрузки (jpa ... и т. Д.), И я застрял в одной проблеме. Я использую атрибут UUID для первичных ключей. Когда я пытаюсь создать объект как внешний ключ, jpa не может правильно привести объект к моему объекту.

Решение

My UserEntity

@Entity(name = "User")
@Table(name = "USR")
@EntityListeners(UserPersistListener.class)
@EqualsAndHashCode
public class UserEntity {

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(name = "ID", updatable = false)
    @Getter
    @Setter
    private UUID id;

    @Column(name = "LOGIN", updatable = false)
    @Getter
    @Setter
    private String login;

    @Column(name = "PASS")
    @Getter
    @Setter
    private String pass;

    @Enumerated(EnumType.STRING)
    @Column(name = "ROLE")
    @Getter
    @Setter
    private Role role;

}

Моя другая сущность, использующая UserEntity (внешний ключ)

@Entity(name = "Person")
@Table(name = "PERSON")
@EqualsAndHashCode
public class PersonEntity {

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(name = "ID", updatable = false)
    @Getter
    @Setter
    private UUID id;

    @Column(name = "NAME")
    @Getter
    @Setter
    private String name;

    @Column(name = "SUBSCRIPTION")
    @Getter
    @Setter
    private Long subscription;

    @Enumerated(EnumType.STRING)
    @Column(name = "SUBSCRIPTION_TYPE")
    @Getter
    @Setter
    private SubscriptionType subscriptionType;

    @Column(name = "PHONE1")
    @Getter
    @Setter
    private Long phone1;

    @Column(name = "PHONE2")
    @Getter
    @Setter
    private Long phone2;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "CREATED_BY", referencedColumnName = "ID", updatable = false)
    @Getter
    @Setter
    private UserEntity createdBy;

    @Convert(converter = LocalDateAttributeConverter.class)
    @Column(name = "CREATION_DATE")
    @Getter
    @Setter
    private LocalDateTime creationDate;

}

Исключение

org.springframework.data.domain.PageImpl["content"]->java.util.Collections$UnmodifiableRandomAccessList[0]->br.com.orangesun.entity.person.PersonEntity["createdBy"]->br.com.orangesun.entity.user.UserEntity_$$_jvst424_1["id"])
2019-06-18 00:52:55.163  WARN 15432 --- [nio-8099-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42883
2019-06-18 00:52:55.164 ERROR 15432 --- [nio-8099-exec-9] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: operator does not exist: uuid = character varying
  Hint: No operator matches the given name and argument types. You might need to add explicit type casts.

EDIT

Определение моей базы данных

| Field Name        | Type    |
|-----------------------------|
| id                | uuid    |
| name              | varchar |
| subscription      | int8    |
| subscription_type | varchar |
| created_by        | uuid    |
| creation_date     | instant |
| phone1            | int8    |
| phone2            | int8    |
|-----------------------------|

РЕДАКТИРОВАТЬ 2

Другие подробности об этой же ошибке

java.lang.IllegalArgumentException: Provided id of the wrong type for class br.com.orangesun.entity.person.PersonEntity. Expected: class java.lang.String, got class java.util.UUID

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Попробуйте использовать тип UUID вместо String для полей 'id', поскольку UUID - это двоичный формат, а не символьный, поэтому базы данных используют специальный тип для полей UUID.

0 голосов
/ 18 июня 2019

UUID в Postgres автоматически конвертируется для вас в тип данных UUID. Вы должны изменить свой тип данных id со String на UUID, и все будет работать как положено.

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(name = "ID", updatable = false)
@Getter
@Setter
private UUID id;
0 голосов
/ 18 июня 2019

Обновите свой класс PersonEntity, как показано ниже,

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CREATED_BY", referencedColumnName = "ID”, updatable = false)
@Getter
@Setter
private UserEntity createdBy;

Добавьте referencedColumnName к вашему @ joinColumn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...