peacess

          統計

          留言簿(14)

          積分與排名

          閱讀排行榜

          評論排行榜

          hibernate 多對多關系在mysql、oracle中的不同

          用戶(User)與角色(Role)多對多關系(UserRole)
          下面是表的代碼(配置為annotation)
          User:

          package sub;
          import java.io.Serializable;
          import java.util.Set;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.Id;
          import javax.persistence.JoinColumn;
          import javax.persistence.JoinTable;
          import javax.persistence.ManyToMany;
          @Entity
          public class User implements Serializable
          {
              /**
               * 
               */
              private static final long serialVersionUID = 1L;
              private Long id;
              private Set<Role> roles;
              @Id
              @GeneratedValue
              public Long getId()
              {
                  return id;
              }
              public void setId(Long id)
              {
                  this.id = id;
              }
              @ManyToMany
              @JoinTable(name="UserRole",joinColumns={@JoinColumn(name="user_ID")},inverseJoinColumns={@JoinColumn(name="role_ID")})
              public Set<Role> getRoles()
              {
                  return roles;
              }
              public void setRoles(Set<Role> roles)
              {
                  this.roles = roles;
              }
          }

          Role:

          package sub;
          import java.io.Serializable;
          import java.util.Set;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.Id;
          import javax.persistence.JoinColumn;
          import javax.persistence.JoinTable;
          import javax.persistence.ManyToMany;
          @Entity
          public class Role implements Serializable
          {
              /**
               * 
               */
              private static final long serialVersionUID = 1L;
              private Long id;
              private Set<User> users;
              @Id
              @GeneratedValue
              public Long getId()
              {
                  return id;
              }
              public void setId(Long id)
              {
                  this.id = id;
              }
              @ManyToMany
              @JoinTable(name="UserRole",joinColumns={@JoinColumn(name="role_ID")},inverseJoinColumns={@JoinColumn(name="user_ID")})
              public Set<User> getUsers()
              {
                  return users;
              }
              public void setUsers(Set<User> users)
              {
                  this.users = users;
              }
          }

          UserRoleId:

          package sub;
          import java.io.Serializable;
          import javax.persistence.Embeddable;
          @Embeddable
          public class UserRoleId implements Serializable
          {
              /**
               * 
               */
              private static final long serialVersionUID = 1L;
              private Long userId;
              private Long roleId;
              public UserRoleId(Long userId, Long roleId)
              {
                  this.userId = userId;
                  this.roleId = roleId;
              }
              public UserRoleId()
              {
                  this(null,null);
              }
              @Override
              public boolean equals(Object obj)
              {
                  if(obj == this)return true;
                  if(obj instanceof UserRoleId)
                  {
                      final UserRoleId other = (UserRoleId) obj;
                      Long userT = getUserId();
                      Long userOther = other.getUserId();
                      Long roleT = getRoleId();
                      Long roleOther = other.getRoleId();

                      return ((userT == userOther) || (userT != null &&
                              userOther != null && userT.equals(userOther))) &&
                              ((roleT == roleOther) || (roleT != null &&
                                      roleOther != null && roleT.equals(
                                              roleOther)));
                  }
                  return false;
              }
              @Override
              public int hashCode()
              {
                  int re = 17;
                  re += (userId == null?0:userId.hashCode());
                  re += (roleId == null?0:roleId.hashCode());
                  return 37*re;
              }
              public Long getUserId()
              {
                  return userId;
              }
              public void setUserId(Long userId)
              {
                  this.userId = userId;
              }
              public Long getRoleId()
              {
                  return roleId;
              }
              public void setRoleId(Long roleId)
              {
                  this.roleId = roleId;
              }
          }

          UserRole:

          package sub;
          import java.io.Serializable;
          import javax.persistence.AttributeOverride;
          import javax.persistence.AttributeOverrides;
          import javax.persistence.Column;
          import javax.persistence.EmbeddedId;
          import javax.persistence.Entity;
          import javax.persistence.FetchType;
          import javax.persistence.JoinColumn;
          import javax.persistence.ManyToOne;
          @Entity
          public class UserRole implements Serializable
          {
              /**
               * 
               */
              private static final long serialVersionUID = 1L;
              private UserRoleId id;
              private Role role;
              private User user;
              @EmbeddedId
              @AttributeOverrides( {
                      @AttributeOverride(name = "userId", column = @Column(name = "user_ID", unique = false, nullable = false, insertable = true, updatable = true)),
                      @AttributeOverride(name = "roleId", column = @Column(name = "role_ID", unique = false, nullable = false, insertable = true, updatable = true)) })
              public UserRoleId getId()
              {
                  return id;
              }
              @ManyToOne(cascade = {})
              @JoinColumn(name = "role_ID", unique = false, nullable = false, insertable = false, updatable = false)
              public Role getRole()
              {
                  return role;
              }
              @ManyToOne(cascade = {}, fetch = FetchType.EAGER)
              @JoinColumn(name = "user_ID", unique = false, nullable = false, insertable = false, updatable = false)
              public User getUser()
              {
                  return user;
              }
              public void setId(UserRoleId id)
              {
                  this.id = id;
              }
              public void setRole(Role role)
              {
                  this.role = role;
              }
              public void setUser(User user)
              {
                  this.user = user;
              }
          }

              在mysql數據庫中,保存UserRole時出錯。而完全相同的代碼在oracle數據中正確。
          操作如下:
                  User user;
                  Role role;
                  //經過多步操作以后,user與role都保存到數據庫,與之相關聯的session已關閉
                  Session s = null;//取得s的代碼沒有寫出來
                  s.beginTransaction();
                  UserRole userRole = new UserRole();
                  userRole.setId(new UserRoleId(user.getId(),role.getId()));
                  userRole.setUser(user);
                  userRole.setRole(role);
                  s.persist(userRole);
                  s.getTransaction().commit();
          //一提交就出錯,提示user沒有保存,但是奇怪的是為什么在oracle中完全正確。
          //最后在mysql中作如下的修改可以正確保存
          //把 userRole.setUser(user)與userRole.setRole(role)刪除
          有那位知道是什么問題,請告之

          posted on 2007-06-11 23:19 中東 閱讀(2158) 評論(1)  編輯  收藏 所屬分類: hibernate

          評論

          # re: hibernate 多對多關系在mysql、oracle中的不同 2007-06-12 08:12 flybean

          Output the SQLs  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 新兴县| 红河县| 永年县| 江门市| 平南县| 水富县| 右玉县| 富裕县| 汕头市| 唐山市| 涞水县| 治县。| 广灵县| 阳高县| 阿克陶县| 岱山县| 墨竹工卡县| 石嘴山市| 延川县| 河源市| 长汀县| 环江| 新兴县| 辽宁省| 桑日县| 绥中县| 襄汾县| 常德市| 东阿县| 腾冲县| 三河市| 来安县| 曲周县| 遂昌县| 红安县| 长沙市| 双牌县| 治多县| 洛浦县| 宣威市| 阆中市|