我需要实现实体属性延迟加载。我采用了单表继承方法。
@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> {}
不幸的是,这只适用于鉴别器列。实际上,我不需要区分这两个实体。只需要排除 lastName
从 Person
只有在 VerbosePerson
正在请求。
一种解决方法是声明 @MappedSuperClass
应该有两个继承的实体( Person
以及 VerbosePerson
). 但在这种情况下, Person
不会是你的超型 VerbosePerson
这不方便。
有没有办法不用鉴别器就使用单表策略继承?
2条答案
按热度按时间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)注解属性是不够的。
mepcadol2#
字段的延迟加载需要字节码增强。那你可以用
@Basic(fetch = LAZY)
第一次访问时,该字段将被延迟加载。另请参见https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/hibernate_user_guide.html#bytecodeenhancement