无法使用java.util.uuid从mysql db检索数据,其中主键为二进制(128)

qqrboqgw  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(450)

就像标题上说的。我将实体存储在 MySql DB 使用 JPA 以及 Hibernate . 我用的是 java.util.UUID 在java方面作为我的 @Id . 在db端,主键是 binary(128) . 坚持很好。没有错误。但是使用 UUID 当钥匙回来的时候 null 每一次。在数据库中查找用作 binary 似乎与 java.lang.String 代表 UUID 所以一切似乎都在顺利地被翻译。但就像我说的,当尝试检索时,测试无法确认检索。切换到我的另一个数据类型 @Id 因为我需要知道 id 甚至在坚持和 UUID 是获得唯一id而不必知道数据库状态的最佳方法。下面是我的实体类、失败的测试和我的模式定义。
架构定义:

create table PLAYER(
ID binary(128) PRIMARY KEY NOT NULL,
USERNAME VARCHAR(50) unique NOT NULL,
PASSWORD varchar(100) NOT NULL,
JOIN_DATE DATETIME);
``` `Player.java` ```
@Entity
@Table(name = "PLAYER")
public class Player extends AbstractEntity{

@Column(name = "USERNAME")
private String username;

@Column(name = "PASSWORD")
private String password;

@Column(name = "JOIN_DATE")
private LocalDate joinDate;
``` `AbstractEntity.java` ```
@MappedSuperclass
public abstract class AbstractEntity implements Serializable {

@Id
@Column(name = "ID")
protected UUID id;

最后,失败的测试

@Test
    void findById() {

    Player patrick = new Player();
    patrick.setId(uuid);
    patrick.setUsername("patrick");
    patrick.setPassword("password");
    patrick.setJoinDate(LocalDate.now());
    playerRepo.save(patrick);

    Optional<Player> result = playerRepo.findById(uuid);
    if (result.isEmpty()) {
        fail();
    }
    }
pzfprimi

pzfprimi1#

请尝试按以下方式更正测试用例:

@Test
void findById() {

   Player patrick = new Player();
   // ...
   playerRepo.save(patrick);
   entityManager.flush();

   Optional<Player> result = playerRepo.findById(uuid);
   // ...
}
ikfrs5lh

ikfrs5lh2#

可以将columndefinition属性添加到列注解

@Column(name = "ID", columnDefinition="BINARY(128)")
protected UUID id;

相关问题