【问题标题】:spring boot data redis repository @Id annotation vs jpa repository @Idspring boot 数据 redis 仓库 @Id 注解 vs jpa 仓库 @Id
【发布时间】:2017-09-24 03:41:46
【问题描述】:

我正在使用spring boot 1.5.2,以及spring boot data redis 1.8。

我有两个@Id 注解,一个用于JPA,另一个用于redis hash。这里我想使用由 mysql 主键 AUTO_INCREMENT 生成的 JPA @Id 值。

但是我发现每次使用redis的@Id注解,在redis中我的id都会是另一个随机值,但是我想用mysql的主键。

我的实体是这样的:

@Entity
@Table(name = "orders")
@RedisHash(value = "order")
public class Order {
    private Long id;
    private Long userId;

    @org.springframework.data.annotation.Id //for redis
    @Id //for mysql
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "user_id")
    public Long getUserId() {
        return userId;
    }
}

我的服务是这样的:

@CachePut(value = "order", key = "#order.id")
@Override
public void save(OrderDTO orderDTO) {
    try {
        Order order = BeanMapper.map(orderDTO, Order.class);
        order = orderRepository.save(order);
        System.out.println(order);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我收到以下错误:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null

redis 数据如下:

127.0.0.1:6379> keys *
1) "order"
2) "order:1222702657038933405"

我想得到这样的结果:

order:12

其中12个是由mysql PRIMARY KEY生成的。

我尝试从Order 中删除@RedisHash,发现无法为redis 创建缓存。我找不到哪里错了。

非常感谢。

【问题讨论】:

    标签: spring-boot redis spring-cache spring-data-redis


    【解决方案1】:

    我们可以使用您需要的任何序列开始创建一个密钥,并在保存新密钥之前递增相同的序列

    1. On the start of an application

    2. On save of each key value

    【讨论】:

    • 请勿张贴代码图片。只需将代码直接复制粘贴到您的答案中即可。
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多