views:

68

answers:

1

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?

+3  A: 

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.

Pascal Thivent
Yes it is a many to one. I tried the code and it says fetch is not a valid attribute.I tried removing it and it says "MappingException.Could not determine type for a.b.c.User"
@user378101: Little typo, `fetch` is an annotation element of `ManyToOne`. Regarding the second error, it seems `User` is not an entity (you need to annotate it with `@Entity` and to declare it in your `persistence.xml`). Only entities can be used in associations.
Pascal Thivent
I suspected this but the User class is already annotated with @Entity.
@user378101: Can you show the `User` class? Are you sure you don't get any error message at application startup (something that would prevent `User` to get mapped properly)?
Pascal Thivent
Thanks, it works now. I had annotated the getUser method. Tried annotating the field and it works. What is the difference?
@user378101: See http://stackoverflow.com/questions/3286508/where-to-put-hibernate-annotations
Pascal Thivent