2013-05-08 105 views
1

我试图获取元素集合时遇到了一个问题:Friend集合为空。休眠:获取集合

有3类:

@Entity 
@Table(name="USER") 
public class User { 
@Id 
@Column(name="USER_ID", nullable=false) 
private String mail; 

@Column(name="PASSWORD") 
private String password; 

@Column(name="SURNAME") 
private String surname; 

@Column(name="NAME") 
private String name = null; 

@Column(name="STATUT") 
private StatutUser statut; 

@Column(name="PHONENUMBER") 
private int phoneNumber; 

@OneToMany(cascade = CascadeType.PERSIST, mappedBy="friendPK.friend") 
@Fetch(FetchMode.JOIN) 
    private Set<Friend> friends = new HashSet<Friend>(); 

    ... 
    Some getters and setters 

第二个:

@Entity 
@Table(name = "FRIEND") 
public class Friend 
{ 

@EmbeddedId 
public FriendPK friendPK; 

@Column(name = "FRIEND_STATUT") 
private StatutFriend statutFriend; 

... 
} 

最后一个:

@SuppressWarnings("serial") 
@Embeddable 
public class FriendPK implements Serializable{ 

    @ManyToOne 
    @JoinColumn(name="USER1_ID", referencedColumnName="USER_ID") 
    protected User user1; 

    @ManyToOne 
    @JoinColumn(name="USER2_ID", referencedColumnName="USER_ID") 
    protected User friend; 
} 

当我试图让所有的朋友的用户,收集是空的。

这里的文件,其中添加关系的方法是:

private EntityManagerFactory emf; 
private EntityManager manager; 

public String addFriends(String mail1, String mail2){ 

     EntityTransaction t; 
     t = manager.getTransaction(); 

     try{ 
      t.begin(); 

      User user = manager.find(User.class, mail1); 

      User friend = manager.find(User.class, mail2); 

      Friend f = new Friend(); 
      f.setStatutFriend(StatutFriend.TOCHECK); 
      FriendPK friendPK = new FriendPK(); 
      friendPK.setFriend(friend); 
      friendPK.setUser1(user); 
      f.setFriendPK(friendPK); 

      Set<Friend> relationship = new HashSet<Friend>(); 
      relationship = user.getFriends(); 
      relationship.add(f); 

      Set<Friend> relationship2 = new HashSet<Friend>(); 
      relationship2 = friend.getFriends(); 
      relationship2.add(f); 

      user.setFriends(relationship); 
      friend.setFriends(relationship2); 

      manager.persist(user); 

      t.commit(); 
      error.setReq(StatutReq.DONE); 
     } 
     catch(Exception e){ 
      error.setReq(StatutReq.ABORTED); 
      error.setError(e.getMessage()); 
     } 
     finally 
     { 
      if (t.isActive()) 
      { 
       t.rollback(); 
      } 
     } 

请纵容我的代码。我是一个新手! 非常感谢。

回答

0

乍一看,代码似乎是正确的,尽管你的架构看起来很奇怪。 班级friendFK代表什么? 不是用户只需要持有一组用户设置? 从数据库的角度来看,关系表是必需的,但不在你的java模型中。

如果我是你,我会删除这个类并使用hbm2dll工具来生成一个正确的匹配数据库模式。

你可以指定你的Hibernate和JARS版本,并给我们你的休眠配置文件来检查它。

+0

谢谢你的回答。我改变了我的全球结构,而不使用friendFK。现在它正在工作! – fchenebault 2013-05-13 08:09:27