hibernate实体继承单表延迟加载

ws51t4hk  于 2021-07-22  发布在  Java
关注(0)|答案(2)|浏览(362)

我需要实现实体属性延迟加载。我采用了单表继承方法。

@Entity
@Table(name = "person")
@Getter
public class Person {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @Column(name = "firstname")
    private String firstName;
}

@Entity
@Getter
public class VerbosePerson extends Person {
    @Column(name = "lastname")
    private String lastName;
}

public interface PersonRepository extends JpaRepository<Person, Long> {}
public interface VerbosePersonRepository extends JpaRepository<VerbosePerson, Long> {}

不幸的是,这只适用于鉴别器列。实际上,我不需要区分这两个实体。只需要排除 lastNamePerson 只有在 VerbosePerson 正在请求。
一种解决方法是声明 @MappedSuperClass 应该有两个继承的实体( Person 以及 VerbosePerson ). 但在这种情况下, Person 不会是你的超型 VerbosePerson 这不方便。
有没有办法不用鉴别器就使用单表策略继承?

tvokkenx

tvokkenx1#

听起来您需要的是延迟查询,而不是继承。您应该看看fetchtype注解
https://thorben-janssen.com/entity-mappings-introduction-jpa-fetchtypes/
不过要注意。。它们主要用于管理列表的延迟加载(可以轻松代理的内容)。懒散地关联单个项(例如@manytoone或简单字符串等)通常需要一些仔细的对象代理,以确保它以您认为应该在持久性框架中的方式工作。一般来说,我不怎么使用它,但我想我确实在某个时候懒洋洋地加载了一个类,这个类的变量Map到了我懒洋洋地加载的hibernate对象的一行。。
退房:
https://thorben-janssen.com/lazy-load-non-relational-attributes/#:~:text=the%20jpa%20指定%20定义%20,值%20必须%20急切地%20获取。
特别注意以下部件:
实际上,这意味着根据您的jpa实现,用@basic(fetch=fetchtype.lazy)注解属性是不够的。

mepcadol

mepcadol2#

字段的延迟加载需要字节码增强。那你可以用 @Basic(fetch = LAZY) 第一次访问时,该字段将被延迟加载。另请参见https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/hibernate_user_guide.html#bytecodeenhancement

相关问题