Below is my Owning side Entity –
@Entity
@Table(name = "T_PERSON")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
private Long id;
private String firstName;
private String lastName;
private IdCard idCard;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String firstName, String lastName) {
this.firstName=firstName;
this.lastName=lastName;
}
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "FIRST_NAME")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name = "LAST_NAME")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_CARD_ID")
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
Inverse side Entity –
@Entity
@Table(name = "T_ID_CARD")
public class IdCard {
private Long id;
private String idNumber;
private Date issueDate;
//private Person person;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "ID_NUMBER")
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
@Column(name = "ISSUE_DATE")
@Temporal(TemporalType.TIMESTAMP)
public Date getIssueDate() {
return issueDate;
}
public void setIssueDate(Date issueDate) {
this.issueDate = issueDate;
}
}
Persistence.xml –
<persistence-unit name = "RestSpringJPAPractice" transaction-type = "RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.practice.rest.spring.jpa.Person</class>
<class>com.practice.rest.spring.jpa.Geek</class>
<class>com.practice.rest.spring.jpa.IdCard</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@somehost:someport:somesid" />
<property name="javax.persistence.jdbc.user" value="some_user" />
<property name="javax.persistence.jdbc.password" value="some_pwd" />
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
<property name="hibernate.show_sql" value="true"/>
<!-- <property name="hibernate.cache.use.query_cache" value="false"/> -->
<!-- <property name="hibernate.format_sql" value="true"/> -->
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
Now for below code –
TypedQuery<Person> query = entitymanager.createQuery("from Person", Person.class);
List<Person> resultList = query.getResultList();
for (Person person : resultList) {
StringBuilder sb = new StringBuilder();
sb.append(person.getFirstName()).append(" ").append(person.getLastName()).append(" ");
IdCard idCard = person.getIdCard();
if(idCard != null)
sb.append(idCard.getIdNumber()).append(" ").append(person.getIdCard().getIssueDate());
}
Hibernate generates below query only –
select person0_.id as id1_2_, person0_.FIRST_NAME as first_na2_2_, person0_.ID_CARD_ID as id_card_4_2_, person0_.LAST_NAME as last_nam3_2_, person0_1_.FAV_LAN as fav_lan1_0_, decode(person0_.id, person0_1_.id, 1, 0) as clazz_ from T_PERSON person0_, T_GEEK person0_1_ where person0_.id=person0_1_.id(+)
My question –
- How and when IdCard.idNumber and IdCard.issueDate is being fetched when the above query does not include IdCard table
- why hibernate is not generating additional query for fetching IdCard when person.getIdCard(); is explicitly called
- Is IdCard is being fetched eagerly when the it is configured with FetchType.LAZY ? if so, where is the generated query?