2

ユーザーとタグのテーブルがあり、多対多の関係を保持する user_tag_xref テーブルもあります。現在、netbeans はエンティティ クラスを生成します (eclipselink を使用)。以下はエンティティ マッピング関係です。

ユーザークラス

@ManyToMany(mappedBy = "usersList")
    private List<Tags> tagsList;

タグクラス

@JoinTable(name = "USERS_TAG_XREF", joinColumns = {
        @JoinColumn(name = "TAG_ID", referencedColumnName = "TAG_ID")}, inverseJoinColumns = {
        @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")})
    @ManyToMany
    private List<Users> usersList;

今、私のビジネス ロジック RESTfull サービスでは、json クライアントがこのメソッドを使用します。

 @POST
    @Path("/registration2/tag") 
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
    public Response registration2_3(List<Tags>tagList,@Context HttpServletRequest req){

         Profile p =(Profile) registerMap.get(req.getSession().getId());
     Users u = em.find(Users.class,p.getUserId());


    for(Tags t : tagList){
        t.getUsersList().add(u);
        u.getTagsList().add(t); 
        em.merge(t);
        em.merge(u); 

    }     
   logger.log(Level.INFO, "the taglist created for user");

       return Response.ok(u,MediaType.APPLICATION_JSON).build(); 
    }

問題は、新しいユーザーをマージして多対多の関係を作成するたびに、既存の userid=6201 に 2,3,4 のタグがあり、新しいユーザーが ID 2,3,4 のタグを使用しようとする場合です。 、既存のユーザーが削除され、新しいユーザーがタグにマージされます。エンティティクラスのメソッドにハッシュとイコールをオーバーライドすることに関するいくつかの記事を読みました。これらのメソッドはデフォルトで eclipselink でオーバーライドされます。また、List<> 型は json 配列に対して完全に機能するため、コレクション型を Set または Collection に変更できません。4 24 時間経ちましたが、現在苦労しています。デフォルトのマッピング戦略が間違っている可能性がありますか? カスケードする必要がありますか?

4

3 に答える 3

3

マージのセマンティクス (ここで説明されているように) は単なる更新とは少し異なるため、マージを使用するときは特に注意する必要があります。あなたの関係は双方向であり、ユーザーは逆側であるため、関係の永続化はすべてタグ側で処理されます。タグリストに切り離されたタグが含まれていると仮定すると、すべてのタグに ID が設定されていることを意味し、tagList を反復処理する必要があります。

Tag managedTag = em.merge(t);

これにより、t が新しいインスタンス (管理されていない) である場合、そのインスタンスの永続的な表現が返され、後で使用する必要があるか、またはインスタンスに ID が設定されている場合、ORM はデータベースからのデータを使用して管理されたインスタンスを作成します。 (または、存在する場合は第 1/第 2 レベルのキャッシュから)。返されたインスタンスは管理されているものです

for(Tags t : tagList){
        Tag managedTag = em.merge(t);
        managedTag.getUsersList().add(u);
        u.getTagsList().add(t);         
       User managedUser =  em.merge(u); 

    } 

また、タグ側でマージ カスケード オプションを設定して、2 回目のマージ呼び出しを保存し、ORM が関係を自動的に管理できるようにすることもできます。

于 2013-10-10T11:04:57.593 に答える
0

新しいエントリを追加するときに、マッピングが重複していないか、データベースに既に存在していないことを検証する必要があります。ソリューションをより明確にするために、リンクで提供されている私の魂を見てください。

多対多の休止状態でリレーションシップ テーブル データが上書きされる

于 2021-09-10T11:46:26.467 に答える