FindByUUID()使用Spring Data的JPA Repository

时间:2013-08-21 06:19:42

标签: mysql spring hibernate jpa 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;
  }
}

带有Hibernate的Spring Data JPA在我的MySQL数据库中正确创建了所有内容。但是,当我尝试使用我的JPARepository实现来使用其uuid搜索项目时,它永远找不到任何东西,即使它在DB上执行查询查询(我可以在我的调试器中看到)。这是我的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);
}

我错过了什么吗?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

尝试使用UUID注释您的@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDCharType")媒体资源 或
@org.hibernate.annotations.Type(type="org.hibernate.type.UUIDBinaryType")

由于MSB / LSB以二进制格式与UUID交换,我遇到了与UUID查询数据库类似的问题;我们解决了将数据处理为String并在转换前进行必要转换的问题。

答案 1 :(得分:0)

我最近解决了同样的问题,如果有人在这里遇到困难,我的解决方案是用

注释列。
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;

为我解决了这个问题。

答案 2 :(得分:0)

有同样的问题,特别是它在H2中有效,但在MySQL中无效。

此外,由于Hibernate(在JPA下)正在查询以查看记录是否存在并且找不到,因此我尝试更新记录时遇到了主要键约束失败。

使用@Column(length = 16)也可以很好地解决此问题,假设MySQL使用的是BINARY列...否则,由于该列在数据库中具有额外的数据,匹配将失败(我认为默认为BINARY [ 32])。

答案 3 :(得分:0)

将二进制列更改为String。默认为二进制,必须添加此附加符号

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