Hibernate如何通过惰性对象获取id

时间:2014-06-06 03:53:58

标签: java hibernate

我有实体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); 

1 个答案:

答案 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字符串中选择延迟加载。