2015-01-04 146 views
3

我使用Spring Data JPA和Hibernate作为提供者。我创建了几个扩展到JPARepository<Entity,Serializable>类的Repository类。我现在失败了,因为我正在抓取一个它带来连接/连接实体的实体!它们通过@OneToOne@OneToMany等连接。如何避免获取这些连接的实体?
我尝试过@OneToMany(fetch=FetchType.LAZY)等,但仍然没有运气。以下是我的Java代码:
如何使用Spring数据JPA(JPARepository)实现延迟加载?

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总是获取用户entit我也不想这样做。我怎么能做到这一点?
enter image description here

感谢

+0

您的代码正在获取用户对象并在票证上设置“创建者”,并且您希望创建者为空? – 2015-01-04 11:40:25

+0

@RC。你是对的,因为映射我必须这样设置!可能是我映射的方式是错误的!任何关于映射部分的想法? – agpt 2015-01-04 11:48:42

+0

OneToOne的延迟读取存在问题(可能在下面的Harshal Patil的答案中解决),但是您应该对OneToMany的延迟读取(fetch = FetchType.LAZY)没有问题。如果字段被这样的注解初始化,这可能意味着你可以在某处之前访问用@OneToMany注解的属性(应该是一个集合或一个列表等)。 – 2015-01-05 08:42:46

回答

0

变懒加载工作可空单一对一映射,你需要让Hibernate做Compile time instrumentation并添加@LazyToOne(value = LazyToOneOption.NO_PROXY)到一个一对一的关系。

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

希望这会起作用。

+0

对不起,对于最近的回复,我添加了您提出的更改,但它表示“无法初始化代理 - 没有会话” – agpt 2015-02-08 13:39:48

+0

@agpt在您正在检索创建者的方法上添加交易注释。 – 2015-02-09 04:21:10