我有实体A,A是多对一B,提取类型是懒惰的。
当我使用下面的代码B时仍然很懒惰。
A a = session.get(A.class,aId);//a.getB(); is lazy
B b = session.get(B.class,bId);//this object is same whith a.getB();
//b.id is 0;
//b.name is null;
//b.age is 0;
//if i remove A a = session.get(A.class,aId);
//then
//b.id is bId;
//b.name is "Test";
//b.age = 18;
我怎么能不清空B使用我的代码?
class A{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="bId",nullable = false)
B b;
//getter and setter
}
class B{
@Column
int id;
@Column
String name;
@Column
int age;
//getter and setter
}
//it is in my porject,Shipment is A,OrderDetail is B
Shipment shipment = shipmentDao.getByDate(id, shipmentDate);
OrderDetail od = baseDao.getById(OrderDetail.class, id);
答案 0 :(得分:0)
我认为访问字段和/或访问类型注释可以解决您的问题
来源: http://256stuff.com/gray/docs/misc/hibernate_lazy_field_access_annotations.shtml
从上面的语句中可以看出,只有使用属性访问类型而不是字段访问来映射对象时,才能对getId()进行这种特殊处理。我们对所有对象使用字段访问,这允许我们更好地控制对类的字段的访问,而不是在所有对象上设置方法。诀窍是用" field"定义所有字段。访问类型,但覆盖和使用"属性"在id字段上输入。您需要将@AccessType(" property")注释添加到对象的id字段,并确保您具有有效的getId()和setId()方法。我们使用包受保护的setId()调用进行测试 - 如果你想限制访问更多,使用private可以工作,YMMV。
@Entity
public class Foo {
// the id field is set to be property accessed
@Id @GeneratedValue @AccessType("property")
private long id;
// other fields can use the field access type
@Column private String stuff;
public long getId() { return id; }
public void setId(long id) { this.id = id; }
String getStuff() { return stuff; }
// NOTE: we don't need a setStuff method
}
这将使用id的getId()和setId()访问器,但它将使用reflection fu来设置stuff字段。好东西。现在,当我们调用getId()时,Hibernate知道该方法是id访问器并允许直接调用它而无需调用保存在select上的惰性对象初始化器。显然,如果你调用getStuff(),它将导致在stuff字符串中选择延迟加载。