2013-09-10 4 views
1
@Entity 
@Table(name="dt_user" , uniqueConstraints = {@UniqueConstraint(columnNames="user_no"), @UniqueConstraint(columnNames="account")} 
) 

public class User implements java.io.Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -8149578944942492965L; 
// Fields  

private long id; 
private String userNo; 
private Set<UserRelative> userRelatives = new HashSet<UserRelative>(0); 
// Constructors 
/** default constructor */ 
public User() { 
} 
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="user") 
public Set<UserRelative> getUserRelatives() { 
    return this.userRelatives; 
} 
} 

выше - пользовательский объект, а ниже - другой элемент UserRelative: при желании getUserRelatives() проблема возникает.не удалось лениво инициализировать коллекцию роли

@Entity 
@Table(name="dt_user_relative") 
public class UserRelative implements java.io.Serializable { 
/** 
* 
*/ 
private static final long serialVersionUID = 5035928604641787267L; 
// Fields  

private long id; 
private User user; 
..... 

@Id @GeneratedValue(strategy=IDENTITY) 
@Column(name="id", unique=true, nullable=false) 
public long getId() { 
    return this.id; 
} 

public void setId(long id) { 
    this.id = id; 
} 
@ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="user_id") 

public User getUser() { 
    return this.user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 
..... 
} 

моя проблема в том, что ошибка происходит, когда я этот код преобразования приложений: как я могу получить getRelativeTickets() через userNo? не

userDAO.getUserByNo("10001148").getRelativeTickets().size(); 

public User getUserByNo(String userNo) { 
    // TODO Auto-generated method stub 
    String query = "from User t where t.userNo=?1"; 
    List<User> ls = this.findByQuery(query, userNo); 
    if (ls.size() > 0) 
     return ls.get(0); 
    return null; 
} 

ответ

5

Его неспособность лениво инициализировать коллекцию, так как сеанс Hibernate становится закрытым в конце getUserByNo метод - соединение с базой данных больше не доступен, и объект графа отсоединяется. Теперь, когда вы вызываете метод getRelativeTickets(), Hibernate не может получить ассоциацию, поскольку сеанс больше недоступен, а Hibernate не открывает новое соединение (или сеанс) неявно для ленивой загрузки ассоциаций.

Рекомендованное решение должно гарантировать, что все необходимые ассоциации User полностью инициализированы перед возвратом с getUserByNo. В HQL, вы можете указать охотно принести ассоциацию с использованием from пункт fetch join:

String query = "from User t left join fetch t.relativeTickets where t.userNo=?1"; 

Это вернет User с relativeTickets ассоциации полностью инициализирован. При этом инициализация ассоциации происходит в одном операторе SQL, поэтому для инициализации ассоциации нет необходимости снова удалять БД.

+0

спасибо большое! ответ очень полезен! – xuyaming

+0

@xuyaming приветствуются! –

Смежные вопросы