@ManyToMany
User クラスと Event クラスの間の関連付けを取得しようとしています。私はそのような運がありませんでした。イベントをそれに続く任意の数のユーザーに関連付けることができるようにするために、中間テーブルを作成する必要があり、ユーザーは任意の数のイベントをフォローできます。これは私がこれまでに持っているものです。見つかったいくつかの異なる例を試しましたが、うまくいきませんでした。
ユーザー.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;
}
イベント.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;
}
コードは実行されますが、2 つの間の関連付けを保持する中間テーブルは作成されません。代わりに、シリアル化された 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;
}