Spring JPA LAZY加载OneToOne关系不会加载

时间:2017-05-08 20:19:08

标签: java spring jpa one-to-one

我有一个LAZY OneToOne关系, 我希望每次使用加载它(相同的模型有更多的OneToOne关系,我想对数据库做更少的查询。)

查看日志文件中的本机数据库查询,我可以看到当我没有尝试访问user.city时,SELECT FROM City...语句没有打印出来。

但是当访问user.city时,我可以看到日志中运行的SQL语句,我正在获取类实例。但City实体内填充的所有内容均为null,请参阅以下详细信息:

此代码:

System.out.println(user.city);
System.out.println(user.city.location);

将打印

Hibernate: 
    select
        city0_.id as id1_3_0_,
        city0_.accentName as accentNa2_3_0_,
        city0_.location as location3_3_0_,
        city0_.name as name4_3_0_,
        city0_.state_id as state_id5_3_0_ 
    from
        City city0_ 
    where
        city0_.id=?
com.dateup.models.City@1ed01095
null

是我的模特:

@Entity
@Table(
    indexes={@Index(name = "name", columnList="name")}
)
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    public State state;

    public String name;
    public String accentName;

    @Column(name = "location", columnDefinition = "POINT")
    public Point location;
}
@Entity
@Table(
    name="User"
)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("'User'")
@JsonAutoDetect 
public abstract class BaseUser { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long id;

    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    @OneToOne(fetch = FetchType.LAZY)
    public City city;

    ...
}

请注意,使用@OneToOne(fetch = FetchType.EAGER)进行测试时,一切正常......

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我不会一对一做。

...在城市课程中:

@ManyToOne state;(我通常为一方做EAGER,为其他方面做懒惰; (FetchType.EAGER, CascadeType.ALL, mappedBy='city')

...在州级:

@OneToMany city;(一个州有很多城市)。

您确定在日志中的某处有INSERT语句,这会在正确的ID中添加正确的城市吗?

如果没有看到所有代码,很难知道。