我正在尝试fetchType.Lazy
的示例,但是在调试代码时,似乎fetchType.Lazy
无法正常工作。
实体Bean:地址
在地区字段上添加了具有属性fetch = fetchType.Lazy的注释@Basic。
我的实体bean由以下代码定义:
package model;
import java.io.Serializable;
import javax.persistence.*;
import java.util.List;
/**
* The persistent class for the address database table.
*/
@Entity
@Table(name="address", schema="home")
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@TableGenerator(name = "addr_gen", table = "table_generator", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="addr_gen")
private String addressId;
private String city;
@Basic(fetch=FetchType.LAZY)
@Column(name="district")
private String district;
private String houseNumber;
private String pincode;
private String state;
private String street;
//bi-directional many-to-one association to Employee
@OneToMany(mappedBy="address")
private List<Employee> employees;
public Address() {
}
public String getAddressId() {
return this.addressId;
}
public void setAddressId(String addressId) {
this.addressId = addressId;
}
public String getCity() {
return this.city;
}
public void setCity(String city) {
this.city = city;
}
public String getDistrict() {
return this.district;
}
public void setDistrict(String district) {
this.district = district;
}
public String getHouseNumber() {
return this.houseNumber;
}
public void setHouseNumber(String houseNumber) {
this.houseNumber = houseNumber;
}
public String getPincode() {
return this.pincode;
}
public void setPincode(String pincode) {
this.pincode = pincode;
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
public String getStreet() {
return this.street;
}
public void setStreet(String street) {
this.street = street;
}
public List<Employee> getEmployees() {
return this.employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
public Employee addEmployees(Employee employees) {
getEmployees().add(employees);
employees.setAddress(this);
return employees;
}
public Employee removeEmployees(Employee employees) {
getEmployees().remove(employees);
employees.setAddress(null);
return employees;
}
/*@Override
public String toString() {
return "Address [addressId=" + addressId + ", city=" + city
+ ", district=" + district + ", houseNumber=" + houseNumber
+ ", pincode=" + pincode + ", state=" + state + ", street="
+ street + ", employees=" + employees + "]";
}*/
}
使用以上实体bean的方法:
public Address findAddress(EntityManagerFactory emf, UserTransaction tx) {
EntityManager em = emf.createEntityManager();
Address addr = null;
try {
tx.begin();
addr = em.find(Address.class, new String("154"));
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
return addr;
}
因此,在调用
find
方法之后,当我检查了地址对象时,它已经充满了地区字段。请让我知道我是否缺少某些配置,或者代码本身是否存在问题。
最佳答案
问题在于,当在@Basic
批注中使用时,应用服务器可以/可以自行决定何时获取数据更好。如所记录的here
根据documentation,类似于@OneToMany
的注释具有相同的问题,但是在这种情况下,JPA提供程序将更可能考虑FetchType提示。
另一方面,您可以尝试使用大数据字段,例如
@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] document;
看看是否有任何变化(尽管再次,您的应用服务器可以决定总是获取该字段)。
为了检查是否已加载收集字段,我将检查数据库查询日志或执行以下操作:
@PersistenceContext private EntityManager em;
.....
Person person = em.find(Person.class, 1L);//Person entity has a OneToMany relationship to entity Address
em.detach(person);
person.getAddresses().size();//if the Address are now not fetched, it the call should throw an error
关于JPA fetchType.Lazy无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18693849/