2

jpaでリストを更新したいのですが、テーブルが空のままです。エラーはまったくありません。ここにリストされていないだけで、ゲッターとセッターが存在します。

ここに私のクラス:

public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private int id;


@ManyToMany
private List<Course> courses;

}

public class Course implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private int id;

@ManyToMany(mappedBy="courses")
private List<User> users;
}

そして、ここでオブジェクトを保存している私の方法:

public boolean addCourse(User user, Course course){

    List<User> cas = new ArrayList<User>();
    cas.add(user);

    EntityManager em = getEntityManager();
    try{
        em.getTransaction().begin();
        course.setUsers(cas);
        em.getTransaction().commit();
        em.clear();
        return true;
    } catch(Exception e) {
        em.getTransaction().rollback();
        return false;
    }
}
4

1 に答える 1

3

@JoinTableコードは、所有エンティティでの多対多の関係を定義する注釈を追加する必要があります。これは、この場合User、要素が のフィールドをmappedBy指しているためです。注釈は、との関係がデータベース内で使用することを指定します。リレーションシップの要素も指定する必要があります。coursesUser@JoinTablejoinColumnsinverseJoinColumnscascade@ManyToMany

ここに例があります。いくつかの列名を想定しており、ジャンクション テーブルがデータベース内に存在することに注意してください。

public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private int id;


@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(name="USER_COURSE", joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")},
inverseJoinColumns={@JoinColumn(name="COURSE_ID", referencedColumnName="COURSE_ID")})
private List<Course> courses;

}

この例では、データベースに次のテーブルが含まれていることを前提としています

create table USER_COURSE(
   USER_ID integer,
   COURSE_ID integer
)

この記事でこのトピックを取り上げた私のブログにアクセスすることもできます。

于 2013-03-29T14:27:03.410 に答える