【问题标题】:Hibernate 2nd level cache one-to-one doesn't work休眠二级缓存一对一不起作用
【发布时间】:2016-10-14 01:07:14
【问题描述】:

我将 Ehcache 提供程序用于 Hibernate 二级缓存。它缓存一对多集合,注解@Cache,但不缓存一对一:

//hb annotations
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = "details")
    private Details details;

    //getters, setters, constructors etc.

}

//hb annotations
public class Details {

    @GenericGenerator(name = "generator", strategy = "foreign",
    parameters = @Parameter(name = "property", value = "user"))
    @Id
    @GeneratedValue(generator = "generator")
    @Column(unique = true, nullable = false)
    private Integer id;

    @OneToOne
    @PrimaryKeyJoinColumn
    private User user;

    //getters, setters, constructors ets.

}

我使用 Spring JpaRepository 来获取数据:

userRepository.findOne(id);

【问题讨论】:

    标签: java hibernate spring-data-jpa


    【解决方案1】:

    对于ToOne关联only the id (foreign key)的关联实体实例被缓存在所属实例的条目中:

    Hibernate 以脱水形式存储缓存的实体,即 类似于数据库表示。除了外键 @ManyToOne@OneToOne 子端的列值 关联,实体关系不存储在缓存中。

    因此,当拥有的实例从 L2 缓存中组装时,关联实体必须通过其 id 加载。为避免这种情况,请将关联实体(在您的情况下为 Details)也设为可缓存。

    更多详细信息也可通过herehere 获得。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 2010-10-20
      • 2023-03-03
      • 2019-04-02
      • 2021-09-30
      • 2017-07-05
      • 2011-07-08
      相关资源
      最近更新 更多