Hi,
I have a m:n relationship between customers and accounts: This relationship is resolved in another table customer_accounts. The mapping looks like this:
Code:
@Entity
@Table(name = "customer")
public class Customer implements java.io.Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -6910750598751114269L;
/** The person nr. */
private String customerId;
/** The kreditkarten. */
private Set<CustomerAccount> accounts= new HashSet<CustomerAccount>(0);
/**
* Instantiates a new Customer .
*/
public Customer () {
}
public void setAccount(Set<CustomerAccount> accounts) {
this.accounts = accounts;
}
@OneToMany(mappedBy = "customer")
public Set<CustomerAccount> getAccounts() {
return accounts;
}
}
/**
* KontoKunde generated by hbm2java.
*/
@Entity
@Table(name = "customer_account")
public class CustomerAccount implements java.io.Serializable {
@Embeddable
public static class Id implements java.io.Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -4670709908869684158L;
/** The person nr. */
private String customerNo;
/** The konto nr. */
private String accountNo;
/**
* Instantiates a new konto kunde id.
*/
public Id() {
}
/** Getter and Setter for Id */
}
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 5462194076796527642L;
/** The id. */
private Id id = new Id();
/** The kunde. */
private Customer customer;
/** The konto. */
private Account account;
/**
* Instantiates a new konto kunde.
*/
public CustomerAccount() {
}
/*
* Instantiates a new konto kunde.
*
* @param id
* the id
* @param kontoart
* the kontoart
*/
/**
* Erzeugt neue Kunden-Konto Verknuepfung.
*
* @param kunde Kunde
* @param konto Konto
* @param kontoart Art des Kontos (E Einzel, G Gemeinschaft)
*/
public CustomerAccount(Customer cust, Account acc) {
this.id.customerNo = customer.getCustomerNr();
this.id.accountNo = account.getAccountNo();
customer = cust;
account = acc;
}
/**
* Gets the id.
*
* @return the id
*/
@EmbeddedId
@AttributeOverrides( {
@AttributeOverride(name = "customerNo", column = @Column(name = "customer_no", nullable = false)),
@AttributeOverride(name = "accountNo", column = @Column(name = "account_no", nullable = false)) })
public Id getId() {
return this.id;
}
/**
* Sets the id.
*
* @param id
* the new id
*/
public void setId(Id id) {
this.id = id;
}
/**
* Gets the kunde.
*
* @return the kunde
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_no", nullable = false, insertable = false, updatable = false)
@org.hibernate.validator.NotNull
public Kunde getCustomer() {
return this.customer;
}
/**
* Sets the kunde.
*
* @param kunde
* the new kunde
*/
public void setCustomer(Customer cust) {
this.customer = cust;
this.id.customerNo = cust.getCustomerNo();
}
/**
* Gets the konto.
*
* @return the konto
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "account_no", nullable = false, insertable = false, updatable = false)
@org.hibernate.annotations.ForeignKey(name = "fk_kunde_konto_konto_nr")
public Konto getAccount() {
return this.account;
}
/**
* Sets the konto.
*
* @param konto
* the new konto
*/
public void setAccount(Account acc) {
this.account= acc;
this.id.accountNo = acc.getAccountNo();
}
}
/**
* Konto.
*/
@Entity
@Table(name = "account")
public class Account implements java.io.Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 3825508146221476748L;
/** The konto nr. */
private String accountNo;
/** Kunden. */
private Set<CustomerAccount> customer = new HashSet<CustomerAccount>(0);
/**
* Instantiates a new konto.
*/
public Konto() {
}
/**
* Gets the konto nr.
*
* @return the konto nr
*/
@Id
@Column(name = "account_no", unique = true, nullable = false, length = 10)
@org.hibernate.validator.NotNull
@org.hibernate.validator.Pattern(regex = "[0-9]{6,10}+")
public String getAccountNo() {
return this.accountNo;
}
/**
* Sets the konto nr.
*
* @param kontoNr
* the new konto nr
*/
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public void setCustomer(Set<CustomerAccount> cust) {
customer = cust;
}
@OneToMany(mappedBy = "account")
public Set<CustomerAccount> getCustomer() {
return customer;
}
}
If I invoke the method findById() of my customerDAO
Code:
public Customer findById(String customerNo) {
return em.find(Customer, customerNo);
}
hibernate fires these two Select statements:
Code:
/* load de.hd.persistence.Customer */ select
customer0_.customer_no as customer1_595_0_,
...
from
customer customer0_
where
customer0_.customer_nr=?
15:44:21,234 INFO [STDOUT] Hibernate:
/* load one-to-many de.hd.persistence.Customer.accounts */ select
accounts0_.customer_no as customer2_1_,
accounts0_.account_no as account1_1_,
accounts0_.account_no as account1_607_0_,
accounts0_.customer_no as customer2_607_0_
from
customer_account account0_
where
account0_.customer_no=?
The problem is that I can't understand why hibernate tries to fetch the customer accounts although the mapping defines FetchType.LAZY. May anyone help me out? Thanks a lot.
Jonny