我有一个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)
进行测试时,一切正常......
非常感谢你的帮助。
答案 0 :(得分:0)
我不会一对一做。
...在城市课程中:
@ManyToOne state;
(我通常为一方做EAGER,为其他方面做懒惰; (FetchType.EAGER, CascadeType.ALL, mappedBy='city')
)
...在州级:
@OneToMany city;
(一个州有很多城市)。
您确定在日志中的某处有INSERT语句,这会在正确的ID中添加正确的城市吗?
如果没有看到所有代码,很难知道。