当前位置: 首页 > 知识库问答 >
问题:

具有@ManyTomany关系ebean缓存问题

章学义
2023-03-14

当我试图使用ebean缓存系统(带有io.ebean:ebean-redis)读取@ManyTomany关系时,我遇到了一个异常。这是一个springboot应用程序

我正在使用的版本:

  • SpringBootVersion=2.4.3
  • MariaDbVersion=2.7.2
  • EBeanVersion=12.7.2
  • Flywayversion=7.7.0

BaseModel Java类:

@MappedSuperclass
public abstract class BaseModel extends Model {

    @Id
    @GeneratedValue
    private Long id;

    @WhenCreated
    @NotNull
    private Instant createdAt;

    @WhenModified
    @NotNull
    private Instant updatedAt;

    @NotNull
    @SoftDelete
    private Boolean deleted = false;

    protected BaseModel() {
    }

    // here the getters and setters
}

文章Java类:

@Entity
@Table(name = "article")
@Cache
public class DArticle extends BaseModel {

    private static final long serialVersionUID = -7120023327129825322L;

    @NotNull
    @Index
    @Length(20)
    private String code;

    @DbJson
    @NotNull
    private Map<Locale, String> name;

    @NotNull
    private Double unitPrice;

    @ManyToMany(mappedBy = "articles")
    private List<DArticleCategory> articleCategories;

    public DArticle(String code, Map<Locale, String> name, Double unitPrice) {
        super();
        this.code = code;
        this.name = name;
        this.unitPrice = unitPrice;
    }

    // here the getters and setters
}

ArticleCategory Java类:

@Entity
@Table(name = "article_category")
@Cache
public class DArticleCategory extends BaseModel {

    private static final long serialVersionUID = 528512691717594544L;

    @DbJson
    @NotNull
    private Map<Locale, String> name;

    @ManyToMany
    private List<DArticle> articles;

    public DArticleCategory(Map<Locale, String> name) {
        super();
        this.name = name;
    }

    // here the getters and setters

}

SQL(我使用flyway进行迁移):

create table `article` (
  `id`                            bigint auto_increment not null,
  `created_at`                    datetime(6) not null,
  `updated_at`                    datetime(6) not null,
  `deleted`                       tinyint(1) not null,
  `code`                          varchar(20) not null,
  `name`                          longtext not null,
  `unit_price`                    double not null,
  primary key (`id`),
  index (`code`)
);

create table `article_category` (
  `id`                            bigint auto_increment not null,
  `created_at`                    datetime(6) not null,
  `updated_at`                    datetime(6) not null,
  `deleted`                       tinyint(1) not null,
  `name`                          longtext not null,
  primary key (`id`)
);

我尝试执行的代码:

DArticleCategory c = new DArticleCategory(getTranslatedText("Category 1", "Catégorie 1", null));
c.save();

DArticleCategory cat = articleCategoryRepository.findById(1l);
for (DArticle article : cat.getArticles()) {
    //nothing
}

例外情况:

Caused by: java.lang.RuntimeException: Failed to decode cache data
    at io.ebean.redis.encode.EncodePrefixKey.encode(EncodePrefixKey.java:26)
    at io.ebean.redis.RedisCache.key(RedisCache.java:85)
    at io.ebean.redis.RedisCache.get(RedisCache.java:139)
    at io.ebeaninternal.server.deploy.BeanDescriptorCacheHelp.manyPropGet(BeanDescriptorCacheHelp.java:277)
    at io.ebeaninternal.server.deploy.BeanDescriptorCacheHelp.manyPropLoad(BeanDescriptorCacheHelp.java:297)
    at io.ebeaninternal.server.deploy.BeanDescriptor.cacheManyPropLoad(BeanDescriptor.java:1306)
    at io.ebeaninternal.server.loadcontext.DLoadManyContext$LoadBuffer.loadMany(DLoadManyContext.java:215)
    at io.ebean.common.AbstractBeanCollection.lazyLoadCollection(AbstractBeanCollection.java:101)
    at io.ebean.common.BeanList.init(BeanList.java:139)
    at io.ebean.common.BeanList.iterator(BeanList.java:335)
    at db.migration.dev.V2_0_1__katel_test.migrate(V2_0_1__katel_test.java:200)
    at org.flywaydb.core.internal.resolver.java.JavaMigrationExecutor.executeOnce(JavaMigrationExecutor.java:61)
    ... 59 common frames omitted
Caused by: java.lang.IllegalStateException: Expecting String keys but got type:class java.lang.Long
    at io.ebean.redis.encode.EncodePrefixKey.encode(EncodePrefixKey.java:19)
    ... 70 common frames omitted

它看起来是一个非常简单的代码,但我看不出我错在哪里...

共有1个答案

董花蜂
2023-03-14

注释@Cacheable仅对允许作为拦截器的公共公开方法可用。但是您可以获得“CacheManager”服务并在代码中使用它来在内部处理私募方法中的缓存(如果需要的话)。但只有解决一些“特殊”问题,通常的方法是注释公开的方法。

此外,如果您只使用启动程序,您使用的只是spring的基本和糟糕的实现,一个简单的内存缓存。

想想你的应用程序将如何工作(单个应用程序、分布式应用程序、缓存的短/长数据量、...)以及添加任何受支持的缓存管理器(如ehCache、Hazelcast、Caffeine等)的依赖项所需的内存消耗...满足您的要求并提高缓存性能。

 类似资料:
  • 问题内容: 我很长一段时间以来一直遇到这个问题,我已经在网上和网上搜索了SO,但尚未找到解决方案。我希望你能在这方面帮助我。 我在两个实体之间有一个父子关系,如下所示: 关键是,当我创建一个新的子代并将其分配给父代时,父代已经在缓存中时不会更新。 我尝试使用@PreUpdate在持久保留子级时将其自动添加到父级,但是如果我们在2个不同的线程中有2个实体管理器(例如在JBoss中),问题仍然存在,直

  • 我有一出戏!使用ebean进行模型管理的框架项目。我有4个模型,A B C D. A和B是oneTo多,B和C是OneTo多,B和D是One To多。现在我想要一个与所有相关的B C D链接的A列表。 我现在拥有的是 但是性能非常差,根据sql日志,sql查询没有按照我的要求进行连接。是否有任何方法可以对所有这些对象使用查询联接?(即,选择包含4个查询的所有A B C D,并在本地连接它们,而不是

  • 我有这些实体: 用户 角色 权限 一个用户有很多角色,一个角色有很多权限。 null

  • 问题内容: 我有一些与关系有关的实体: 和 使用某些模型执行保存模型时,一切正常。表存储这些实体的所有键。但是,使用驱动程序保存模型时,表不会更改。我认为映射存在问题。 问题答案: 那是预期的行为。在双向多对多关联中,一侧必须是反侧。在您的情况下,这是一面,因为它包含: 拥有关系的字段。除非关系是单向的,否则为必需。 这意味着是关联的所有者,并且Hibernate仅在维护关联时检查该侧。

  • 与本文类似,我有以下(几乎相同)类: 区别在于我的属性是私有的(使用bean作为实体)。 问题是:我如何创建一个查询来返回一个确定的人的所有项目(在JPQL和/或使用CriteriaQuery)? 我找到了所有其他类似的问题,但没有一个对我有帮助,因为所有这些问题都依赖于从项目到人员的导航(不存在从人员的查询): JPQL多人选择 @许多JPA 2复杂查询 JPA 2.0 CriteriaQuer

  • 在一个项目中,我有以下实体:具有连接到关键字的模板部分的模板。这两种关系都是。一些代码: 然后,我尝试使用给定ID查找与某个模板相关的关键字。我使用使用此谓词执行此操作: 由于某些原因,谓词处理得根本不好。尝试调用方法时出现此错误: 组织.hibernate.hql.internal.ast.QuerySyntax 异常: 模板实体部分目录未映射 [选择关键字身份\nfrom mypackage.