0

春の休止状態に問題があります。ユーザーを更新すると、関連するロールが削除されます...カスケードの問題でしょうか? 私はあらゆる種類のカスケード構成を試しました...

@MappedSuperclass
public abstract class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    private int id;

    @OneToOne(cascade = { CascadeType.ALL }  )
    @JoinTable(name="user_roles",  
        joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},  
        inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}  
    )
.
.
.
}

役割

@Entity  
@Table(name="roles")  
public class Role {  

    @Id  
    @GeneratedValue  
    private Integer id;  

    private String authority;  

    @OneToMany(cascade = CascadeType.ALL ) 
    @JoinTable(name="user_roles",   
        joinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")},  
        inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}  
    )
    private Set<User> userRoles;
.
.
.
}

ユーザーロール

@Entity
@Table (name = "user_roles")
public class UserRole {
    @Id
    @Column(name = "user_id")
    private int userId;

    @Column(name = "role_id")
    private int roleId;
.
.
.
}

UserDaoImpl

@Override
    public void updateUser(User user) {
        try {
            this.sessionFactory.getCurrentSession().update(user);
        } catch (HibernateException e) {
            System.out.println(e);
        }
    }

次のようにユーザー(ログインしたユーザー)を取得します。

@RequestMapping(value = "/edit/", method = RequestMethod.GET)
    public String editUser(ModelMap map,Principal principal) {
        try{
            //Get logged in username
            String loggedUserEmail = principal.getName();
            User user = userService.getUserByEmail(loggedUserEmail);

            map.addAttribute("user", user);

        } catch(Exception e) {
            log.error("/user/edit/---"+e);
        }


        return "forms/userForm";
    }

そして、ユーザーフォームでいくつかの変更をコミットした後、更新しようとします。

ああ、次のように UserRole を挿入します。

//Add userRole to db
            UserRole userRole = new UserRole();
            userRole.setUserId(user.getId());
            userRole.setRoleId(1);
            userRoleService.addUserRole(userRole);
4

1 に答える 1

0

Session.updateデタッチされたオブジェクトを永続化します (つまり、オブジェクトの Hibernate セッションのバージョンがこれらの変更を反映するようになります)。そのため、現在の Hibernate セッションから取得していないオブジェクト (おそらく Http セッションにぶら下がっているもの、または で作成したばかりのものnew) を渡すと、そのオブジェクトは UserRole へのリンクを持っていない可能性があります。 call updateHibernate は、その参照が欠落しているため、UserRole を削除するように指示していると考えています。

Id を持っているが、セッションから切り離されている既存の User を使用していると推測します。そのユーザーの ID を使用して Session.load を呼び出し、新しいアタッチされたユーザーを取得してみてください既存の UserRole) を作成し、そのオブジェクトに必要な変更を加えてから、それをコミットします。UserRole は保持する必要があります。

于 2013-09-30T14:51:48.717 に答える