6

I'm using hibernate 4+.

I have two sample tables.

Table A

public class A {
  @Id
  private int id;

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

  // skip getter&setter
}

Table B

public class B {
  @Id
  private int id;

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

  // skip getter&setter
}

Table A(1) - (n)Table B Relation

Can I just get A's id in object B not using join? Something like:

int aid = b.getA().getId(); // b is instance of B;

Although I can use int value instead of A when I declare class B. But another service layer use A with join.

Can I just get id(fk) value?

Phil Dukhov
  • 67,741
  • 15
  • 184
  • 220
Dongin Min
  • 409
  • 3
  • 5
  • 12

3 Answers3

16

Yes, because proxies contain the id anyway. To get the id of an A proxy without initializing it, first declare the id to be accessed via property:

@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;
  }
}

Then, just read the id:

b.getA().getId();

Changing access type for the id is necessary because if you use field access, Hibernate does not distinguish getId() method from other ordinary methods (which trigger proxy initialization when invoked).

Dragan Bozanovic
  • 23,102
  • 5
  • 43
  • 110
9

You can define two fields in B, one representing the relationship, and the other just the column:

  @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;

This way you can access entity A or just A's id from entity B.

Fran Montero
  • 1,679
  • 12
  • 24
  • Does this mean there is only 1 column in the DB "b_id" and this tricks JPA into allowing b.a_id in the JPA query? – Nathan Jul 14 '22 at 18:51
3

I think you can use this post : property access strategy

It is said that the lazy loading will not be triggered if you only access id

Community
  • 1
  • 1
Steve Marion
  • 289
  • 1
  • 9