FindByUUID() с использованием репозитория Spring Data JPA

по какой-то причине я не смог найти подходящий ответ для этого. У меня есть следующий простой объект:

@Entity
@Table(name = "simple_entity")
@Access(AccessType.FIELD)
public class SimpleEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  protected Long id;

  @Column(unique = true, updatable = false)
  protected UUID uuid;

  @PrePersist
  protected void onCreateAbstractBaseEntity() {
      this.uuid = UUID.randomUUID();
  }

  public Long getId() {
      return this.id;
  }

  public UUID getUuid() {
      return this.uuid;
  }
}

Spring Data JPA с Hibernate создает все правильно в моей базе данных MySQL. Однако, когда я пытаюсь использовать свою реализацию JPARepository для поиска элемента с использованием его uuid, он ничего не находит, даже если выполняет поисковый запрос в БД (что я вижу в своем отладчике). Вот моя реализация JPARepository:

public interface SimpleEntityRepository extends JpaRepository<SimpleEntity, Long> {
      SimpleEntity findOneByUuid(UUID uuid);
}

Вот контроллер, который вызывает этот метод.

@Controller
@RequestMapping("/simple_entity")
public class SimpleEntityController {

@Autowired
private SimpleEntityRepository repository;

@RequestMapping(method = RequestMethod.GET, value = "/{simpleEntityId}", produces =        MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<FileDatastore> getSimpleEntity(@PathVariable UUID simpleEntityId)     {
    SimpleEntity record = this.repository.findOneByUuid(simpleEntityId);
    HttpHeaders headers = new HttpHeaders();

    HttpStatus status = (record != null) ? HttpStatus.OK : HttpStatus.NOT_FOUND;

    return new ResponseEntity<>(record, headers, status);
}

Я что-то упускаю?

Спасибо за вашу помощь!


person Manuel Ortiz Bey    schedule 21.08.2013    source источник
comment
Покажите нам реализацию и соответствующий код, где вы вызываете метод.   -  person DannyMo    schedule 21.08.2013


Ответы (4)


Попробуйте аннотировать свой ресурс UUID с помощью @org.hibernate.annotations.Type(type="org.hibernate.type.UUIDCharType")
или
@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDBinaryType").

Я столкнулся с аналогичной проблемой при запросе базы данных с UUID из-за обмена MSB/LSB с UUID в двоичном формате; мы решили проблему обработки данных как String и сделали необходимое преобразование перед преобразованием.

person Luca Basso Ricci    schedule 21.08.2013
comment
Вы имеете в виду аннотировать поле: защищенный UUID uuid; с этим? - person Manuel Ortiz Bey; 22.08.2013

Измените двоичный столбец на строку. По умолчанию используется двоичный файл, вы должны добавить эту надстройку

@Type(type="org.hibernate.type.UUIDCharType")

Eg.

@Id
@GeneratedValue
@Type(type="org.hibernate.type.UUIDCharType")
public UUID id;
person Jarek Wichrowski    schedule 19.11.2018

Была та же проблема, в частности, она работает в H2, но не в MySQL.

Кроме того, я получил ошибки ограничения ПЕРВИЧНОГО ключа при попытке обновить запись, потому что Hibernate (под JPA) запрашивал, существует ли запись, и не нашел ее.

Использование @Column(length=16) также аккуратно решает эту проблему, предполагая, что MySQL использует столбец BINARY... в противном случае сопоставление не удастся из-за того, что столбец имеет дополнительные данные в БД (я думаю, что по умолчанию используется BINARY[32]) .

person David Goldstein    schedule 05.10.2018

Недавно я решал тот же вопрос, и если кто-то наткнется здесь, решение для меня состояло в том, чтобы аннотировать столбец с помощью

@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;

который решил проблему для меня.

person Postman Jo    schedule 27.03.2018