Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate annotations and foreign key relationship

I have a domain object annotated like this for hibernate support.

@Entity
@Table(name = "INPUT")
public class AppInput {

  /**
   * Unique id for this request
   */
  @Id
  @GeneratedValue
  @Column(name = "INPUT_ID")
  private long requestId;
  /**
   * 
   */
  @Column(name = "EMAIL_ID")
  private String emailId;
  /**
   * 
   */
  @Column(name = "REQUEST_DATE")
      private Date requestDate;
  /**
    * 
   */
  @Column(name = "INPUT_STATUS")
   private char status;
  /**
   * 
   */
   @Column(name = "EXPECTED_ORDER_DATE")
  private Date expectedOrdDt;

//Getter and setters
   }

The property emailId is a foreign key referring to say emailId column in User table. Lets say i add a property like this to AppInput.java private User userDetails; How do i annotate this so that, whenever i fetch AppInput from db, the corresponding user details also get populated?

like image 567
user378101 Avatar asked Jul 28 '10 07:07

user378101


1 Answers

The property emailId is a foreign key referring to say emailId column in User table.

Then don't add the emailId property, add a User.

(...) How do i annotate this so that, whenever i fetch AppInput from db, the corresponding user details also get populated?

Not sure since it could be a ManyToOne or OneToOne but I'll assume it's a ManyToOne:

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="USERDETAILS_EMAIL_ID", referencedColumnName="EMAIL_ID")
private User userDetails;

The fetch annotation element is for demonstration purpose, EAGER being actually the default value. The name and referencedColumn annotation elements in JoinColumn are also optional. Below a short summary from the JPA specification:

11.1.21 JoinColumn Annotation

The JoinColumn annotation is used to specify a column for joining an entity association or element collection.

Table 20 lists the annotation elements that may be specified for the JoinColumn annotation and their default values.

If the JoinColumn annotation itself is defaulted, a single join column is assumed and the default values described in Table 20 apply.

The name annotation element defines the name of the foreign key column. The remaining annotation elements (other than referencedColumnName) refer to this column and have the same semantics as for the Column annotation.

If the referencedColumnName element is missing, the foreign key is assumed to refer to the primary key of the referenced table.

See the Table 20 in the spec for complete and exhaustive details.

like image 51
Pascal Thivent Avatar answered Sep 22 '22 00:09

Pascal Thivent