使用Hibernate的Jboss 7.1.1中的多对多关系注释?

问题描述:

我一直在试图获得我的用户类和事件类之间的关联@ManyToMany。我没有这样的运气。我需要创建一个中间表,以便能够将一个事件与其后的任意数量的用户相关联,并且用户可以关注任意数量的事件。这是我迄今为止所做的。我尝试了几个不同的例子,但没有多少运气。使用Hibernate的Jboss 7.1.1中的多对多关系注释?

User.java

@Entity 
@Table(name="users") 
public class User implements Serializable { 

    @Column(name="name", nullable=false) 
    private String name; 
    @Column(name="school", nullable=false) 
    private String school; 
    @Column(name="email", nullable=false) 
    private String email; 

    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private int id; 
    @Transient 
    private int reputation; 

    //@ManyToMany(mappedBy="followers") 
    List<Event> followedEvents = new ArrayList<Event>(); 

    @ManyToMany(
     cascade={CascadeType.PERSIST, CascadeType.MERGE}, 
     mappedBy="followers", 
     targetEntity=Event.class 
    ) 
    public List<Event> getEventList(){ 
     return followedEvents; 
    } 
    public void setEventList(List<Event> list){ 
     followedEvents = list; 
    } 

Event.java

@Entity 
@Table(name="events") 
public class Event implements Serializable{ 

    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private int id; 

    @Column(name="title", nullable=false) 
    private String title; 
    @Column(name="location", nullable=false) 
    private String location; 
    @Column(name="description", nullable=false) 
    private String description; 
    @Column(name="date", nullable=false) 
    private Calendar cal = Calendar.getInstance(); 

    List<User> followers = new ArrayList<User>(); 

    @ManyToMany(cascade = {CascadeType.ALL}, targetEntity=User.class) 
    @JoinTable(name = "EVENT_USER", 
      joinColumns = {@JoinColumn(name = "EVENT_ID")}, 
      inverseJoinColumns = {@JoinColumn(name = "USER_ID")} 
    ) 
    public List<User> getFollowers(){ 
     return followers; 
    } 
    public void setFollowers(List<User> followers){ 
     this.followers = followers; 
    } 

的代码运行,但它不产生保持两者之间的关联的中间表。而是保持序列化的ArrayList。任何帮助理解为什么它没有做什么预计将不胜感激。

如果它的事项,我会包括其中其实我坚持的事件:

public boolean attemptAttending(int eventId, String userName){ 
     User u = null; 
     Event e = null; 

     try { 
      String query = "SELECT * FROM users WHERE name = ?"; 
      Query q = em.createNativeQuery(query, User.class); 
      q.setParameter(1, userName); 
      for(User user : (ArrayList<User>)q.getResultList()) 
       u = user; 

      query = "SELECT * FROM events WHERE id = ?"; 
      q = em.createNativeQuery(query, Event.class); 
      q.setParameter(1, eventId); 
      for(Event event : (ArrayList<Event>)q.getResultList()) 
       e = event; 
     } 
     catch(Exception ex) { 
      return false; 
     } 
     e.getFollowers().add(u); 
     em.persist(e); 

     return true; 

    } 

不能使用ArrayList举行的关联。您必须改为使用收集界面:CollectionListSet。 Hibernate会用自己的PersistentList替换你的ArrayList,它处理脏码,延迟加载等。无论如何,在接口而不是实现上编程总是一个好主意。

private List<Event> followedEvents = new ArrayList<Event>(); 

@ManyToMany(...) 
public List<Event> getEventList(){ 
    return followedEvents; 
} 
public void setEventList(List<Event> list){ 
    followedEvents = list; 
} 
+0

这是有道理的。感谢澄清!虽然我得到了一个不同的错误。我做错了什么吗?我正在定义类型...我认为'由...引起:org.hibernate.MappingException:无法确定类型为:java.util.List,在表:用户,为列:[org.hibernate.mapping.Column( followevents)]' – Andy 2013-04-30 20:39:51

+0

向我们展示完整的实体。看起来你的Id注释是在字段上,但你的ManyToMany注释在getter上。你必须保持一致。 – 2013-04-30 20:41:26

+0

我其实不知道你的意思。就像我提到的大部分教程,我都经历了有限的整体信息。我添加了其他重要的字段,除非您希望我在实体中添加所有内容。 – Andy 2013-04-30 20:57:22