使用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举行的关联。您必须改为使用收集界面:Collection
,List
或Set
。 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;
}
这是有道理的。感谢澄清!虽然我得到了一个不同的错误。我做错了什么吗?我正在定义类型...我认为'由...引起:org.hibernate.MappingException:无法确定类型为:java.util.List,在表:用户,为列:[org.hibernate.mapping.Column( followevents)]' – Andy 2013-04-30 20:39:51
向我们展示完整的实体。看起来你的Id注释是在字段上,但你的ManyToMany注释在getter上。你必须保持一致。 – 2013-04-30 20:41:26
我其实不知道你的意思。就像我提到的大部分教程,我都经历了有限的整体信息。我添加了其他重要的字段,除非您希望我在实体中添加所有内容。 – Andy 2013-04-30 20:57:22