0

@ManyToManyUser クラスと 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;

    }
4

1 に答える 1

3

ArrayList を使用して関連付けを保持することはできません。代わりにコレクション インターフェイスを使用する必要があります: CollectionListまたはSet。Hibernate は、ArrayList を独自の PersistentList に置き換えます。この PersistentList は、ダーティ チェックや遅延読み込みなどを処理します。とにかく、実装ではなくインターフェイスでプログラムすることを常にお勧めします。

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

@ManyToMany(...)
public List<Event> getEventList(){
    return followedEvents;
}
public void setEventList(List<Event> list){
    followedEvents = list;
}
于 2013-04-30T15:39:43.330 に答える