1

私は現在、Java EE/EclipseLinkとpostgreSQLを使用してWebアプリに取り組んでいます。私のエンティティについては、特に「プロジェクト」、「ユーザー」、「権利」(読み取り、書き込み、削除などのアクセス権)を管理しています。これらのエンティティ間の関係は次のとおりです。プロジェクトには、プロジェクトに対する異なる権限を持つ複数のユーザーを含めることができます。したがって、Project + User+Rightという3つの関連付けが得られます。

この協会が存続している間、私は厄介な問題に直面しています。プロジェクトをその情報で永続化すると、すべてが正常になり(DBにあり、アプリで使用できます)、権利とユーザーも永続化されます。次に、それらの間に関連付けを追加したいので、ProjectUserRightという関連付けエンティティを作成し、プロジェクト、ユーザー、および既存のエンティティからの権利を設定しますが、それを永続化すると、以下の例外が発生します。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne « id_project »
Error Code: 0
Call: INSERT INTO project_user_right (id_right, id_project, id_user) VALUES (?, ?, ?)
bind => [3 parameters bound]
Query: InsertObjectQuery(ProjectUserRight@192db555)

これがクラスプロジェクトです:

@Entity
@Table(name="project")
public class Project implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_project", unique=true, nullable=false)
private Integer idProject;


   //bi-directional many-to-one association to ProjectUserRight
@OneToMany(mappedBy="project", cascade={CascadeType.ALL})
private Set<ProjectUserRight> projetUtilDroits;


  ...

クラスUser:

 @Entity
 @Table(name="user")
 public class User implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_user", unique=true, nullable=false)
private Integer idUser;


@Column(name="nom_utilisateur", nullable=false, length=50)
private String userName;

   //bi-directional many-to-one association to ProjectUserRight
@OneToMany(mappedBy="user")
private Set<ProjectUserRight> projetUtilDroits;

   ...

クラス右:

   @Entity
   @Table(name="right")
   public class Right implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_right", unique=true, nullable=false)
private Integer idRight;

@Column(name="type_right", nullable=false, length=10)
private String typeRight;

//bi-directional many-to-one association to ProjectUserRight
@OneToMany(mappedBy="right")
private Set<ProjectUserRight> projetUtilDroits;

    ...

そして、アソシエーションクラス:

 @Entity
 @Table(name="project_user_right")
 public class ProjectUserRight implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private ProjectUserRightPK id;

//bi-directional many-to-one association to Right
    @ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_right", insertable=false, updatable=false)
private Right right;

//bi-directional many-to-one association to Project
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_project", insertable=false, updatable=false)
private Project project;

//bi-directional many-to-one association to User
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_user", insertable=false, updatable=false)
private User user;

そしてProjectUserRightPK(コメントの後に編集):

@Embeddable
public class ProjectUserRightPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;

@Column(name="id_project", unique=true, nullable=false)
private Integer idProject;

@Column(name="id_right", unique=true, nullable=false)
private Integer idRight;
    ...//getters and setters
@Column(name="id_user", unique=true, nullable=false)
private Integer idUser;

関連付けを永続化するために、次のコードを記述しました。

 Project project = getService(Projet.class).getFromID(projectId);//retrieve the existing project from database with id

 User user = getService(Utilisateur.class).getFromID(userId);//retrieve the existing user from database with id

 Right right = getService(Right.class).getFromID(rightId);//retrieve the existing right from database with id
 if(project !=null && user!=null && right!=null){
   ProjectUserRight pud = new ProjectUserRight();
   pud.setRight(right);
   pud.setProject(project);
   pud.setUser(user);
   project.getProjectUserRights().add(pud);
   right.getProjectUserRights().add(pud);
   user.getProjectUserRights().add(pud);
   service(ProjetUtilDroit.class).persist(pud);//call the persist function on this entity (works fine with all other entities)
   }

アソシエーションを永続化する代わりにプロジェクトをマージしようとしましたが、同じエラーが発生します...(idプロジェクトもチェックし、正しく設定されています)誤って注釈が付けられているのはアソシエーションなのかどうか疑問に思っていますが、できます。 tそれを変更する適切な方法を見つけます。

だから、私は本当にあなたの助けが必要です!:-)

よろしくお願いします!

4

1 に答える 1

1

@MapsId注釈がありませんでした:

EmbeddedId 主キー、EmbeddedId 主キー内の属性、または親エンティティの単純な主キーのマッピングを提供する ManyToOne または OneToOne 関係属性を指定します。value 要素は、リレーションシップ属性が対応する複合キー内の属性を指定します。

@MapsId("idRight")
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_right")
private Right right;

@MapsId("idProject")
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_project")
private Project project;

@MapsId("idUser")
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_user")
private User user;
于 2012-07-13T11:22:22.007 に答える