只是获取id列值而不是在hibernate对象中使用join一对多关系

Don*_*Min 5 java hibernate join

我正在使用hibernate 4+.

我有两个样本表.

表A.

public class A {
  @Id
  private int id;

  @OneToMany(fetch=LAZY)
  private List<B> list;

  // skip getter&setter
}
Run Code Online (Sandbox Code Playgroud)

表B.

public class B {
  @Id
  private int id;

  @ManyToOne(fetch=LAZY)
  @JoinColumn(name="b_id")
  private A a;

  // skip getter&setter
}
Run Code Online (Sandbox Code Playgroud)

表A(1) - (n)表B关系

我可以在对象B中获取A的id而不使用join吗?

比如int aid = b.getA().getId(); // b是B的实例;

虽然我在声明类B时可以使用int值而不是A.但是另一个服务层使用A和join.

我可以获得id(fk)值吗?

请帮忙.

Dra*_*vic 12

是的,因为无论如何代理都包含id.要获取A代理的id 而不初始化它,首先声明要通过property访问的id:

@Entity
public class A {
  @Id
  @Access(AccessType.PROPERTY)
  private int id;

  @OneToMany(fetch=LAZY)
  private List<B> list;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,只需读取ID:

b.getA().getId();
Run Code Online (Sandbox Code Playgroud)

更改id的访问类型是必要的,因为如果使用字段访问,Hibernate不会将getId()方法与其他普通方法(在调用时触发代理初始化)区分开来.


Fra*_*ero 6

您可以在 B 中定义两个字段,一个表示关系,另一个仅表示列:

  @ManyToOne(fetch=LAZY)
  @JoinColumn(name="b_id")
  private A a;

  @Column(name="b_id", updatable=false,insertable=false) //Or correct column
  private int a_id;
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以访问实体 A 或仅从实体 B 访问 A 的 id。