如何使用Spring Data JPA (JPARepository)实现延迟加载?

4

我正在使用Spring Data JPA和Hibernate作为提供者。我创建了几个Repository类,这些类都扩展了JPARepository<Entity,Serializable>类。我在获取一个实体时遇到了问题,它会带着连接的实体一起返回!这些实体通过@OneToOne @OneToMany等方式连接。 我该如何避免获取这些连接的实体?
我已经尝试过@OneToMany(fetch=FetchType.LAZY)等方法,但还是失败了。以下是我的Java代码:
Repository

public interface TicketRepository extends JpaRepository<Ticket, Integer>{

}  

工单实体

@Entity
@Table(name = "tbl_tickets")
public class Ticket {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "customer", nullable = false, length = 256)
    private String customer;


    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn
    private User creator; 

    // ... other properties
}  

服务

@Service
public class TicketService {

  public Ticket save(Ticket obj,String id) {
       User user = userService.findById(Integer.valueOf(id));
       obj.setCreator(user);
       Ticket savedTicket = ticketRepository.save(obj);
   }
}  

savedTicket 总是获取用户实体,而我不希望这样。我该如何实现?
enter image description here

谢谢


你的代码正在获取一个用户对象,并将“creator”设置为票据,你期望creator是null吗? - user180100
@RC。你说得对,因为映射的原因,我必须这样设置!也许我的映射方式有误!对于映射部分有什么建议? - Aman Gupta
存在OneToOne的延迟获取问题(也许可以在Harshal Patil的答案中解决),但是使用OneToMany(fetch=FetchType.LAZY)的延迟获取应该不会有问题。如果该字段被初始化为这样的注释,则可能意味着您在此之前访问了带有@OneToMany注释的属性(应该是一个集合或列表等)。 - John Donn
1个回答

1
要使可空的一对一映射实现延迟加载,您需要让Hibernate进行编译时仪器化并在一对一关系中添加@LazyToOne(value = LazyToOneOption.NO_PROXY)
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn
@LazyToOne(value = LazyToOneOption.NO_PROXY)
private User creator;

希望这会起作用。

抱歉回复晚了,我已经添加了您建议的更改,但它显示“无法初始化代理 - 没有会话”。 - Aman Gupta
2
在检索创建者的方法上添加Transactional注释。 - Harshal Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接