matrix1984 2010-03-16 14:34
浏览 186
已采纳

JPA 一对多单向 映射至Mysql的问题

角色Role与权限Authority,我设计成一对多单向关联,数据库mysql:

//Role.java:

@Entity
public class Role implements Serializable {
    private Integer roleid;
    private String rolename;
    private String description;
    private Set<Authority> auths = new HashSet<Authority>();
    
    @Column
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Id
    @GeneratedValue
    public Integer getRoleid() {
        return roleid;
    }
    public void setRoleid(Integer roleid) {
        this.roleid = roleid;
    }
    @Column
    public String getRolename() {
        return rolename;
    }
    public void setRolename(String rolename) {
        this.rolename = rolename;
    }
         //一对多单向关联
    @OneToMany(cascade = CascadeType.REFRESH, fetch=FetchType.EAGER)
    @JoinTable(name = "role_auth", joinColumns = @JoinColumn(name = "roleid"), 
            inverseJoinColumns = @JoinColumn(name = "authorityid"))
    public Set<Authority> getAuths() {
        return auths;
    }
    public void setAuths(Set<Authority> auths) {
        this.auths = auths;
    }
    
    // 添加权限
    public void addAuth(Authority auth) {
        this.auths.add(auth);
    }
    
    @Override 
    public int hashCode() {
        ...
    }
    
    @Override
    public boolean equals(Object obj) {
        ...
    }
}



//Authority.java:

@Entity
public class Authority implements Serializable {
    private Integer authorityid;
    // 范围
    private Range range;
    // 动作
    private Action action;
    
    public Authority() {}
    
    public Authority(Range range, Action action) {
        this.range = range;
        this.action = action;
    }
    
    @ManyToOne
    @JoinColumn(name="actionid", 
            referencedColumnName="actionid")
    public Action getAction() {
        return action;
    }
    public void setAction(Action action) {
        this.action = action;
    }
    @Id
    @GeneratedValue
    public Integer getAuthorityid() {
        return authorityid;
    }
    public void setAuthorityid(Integer authorityid) {
        this.authorityid = authorityid;
    }
    @ManyToOne
    @JoinColumn(name="rangeid", 
            referencedColumnName="rangeid")
    public Range getRange() {
        return range;
    }
    public void setRange(Range range) {
        this.range = range;
    }
    
    @Override 
    public int hashCode() {
        ...
    }
    
    @Override
    public boolean equals(Object obj) {
        ...
    }
    
}



生成的中间表为role_auth,查看建表语句:

mysql> show create table user_role;

| Table     | Create Table
| user_role | CREATE TABLE `user_role` (
  `userid` int(11) NOT NULL,
  `roleid` int(11) NOT NULL,
  PRIMARY KEY  (`userid`,`roleid`),
  UNIQUE KEY `roleid` (`roleid`),//roleid为什么具有唯一性???
  KEY `FK143BF46A889EC6EB` (`userid`),
  KEY `FK143BF46A83497181` (`roleid`),
  CONSTRAINT `FK143BF46A83497181` FOREIGN KEY (`roleid`) REFERENCES `role` (`rol
eid`),
  CONSTRAINT `FK143BF46A889EC6EB` FOREIGN KEY (`userid`) REFERENCES `user` (`use
rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

1 row in set (0.00 sec)



如上红色部分,roleid具有唯一性,这样我在插入角色时就会出现类似“Duplicate entry '2' for key 2”的错误。
该怎么改呢??

 

  • 写回答

5条回答 默认 最新

  • 拽拽的初行者 2010-03-16 15:24
    关注

    [b]好看点:[/b]

    [code="java"]public class Authority implements Serializable {
    // 这个int型的id,是(似乎)JPA规范要求的。被JPA的Provider用来检测
    // 某个具体的对象的状态时,使用的。
    // 所以,每个Entity都要有一个int型的id
    // 如果id相同,即证明是同一个对象,即同一条记录,所以不允许相同
    // 故,常用于作 主键
    private int id;

    // 这个id就是 你实际业务要用到的id,当然可以按照你的需要设为 unique或者
    // 非 unique
    private intauthorityid;

    //....省略 ....
    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥33 集成BiLSTM模型和GCN模型时,前模型的输出不匹配后模型的输入
  • ¥15 关于液体厚度提取,和铺展轨迹数据化处理
  • ¥20 对方微信是wxid如何添加成好友?或者转换成微信号?
  • ¥15 yolov5实验数据好,但是自己拍摄的照片检测结果差
  • ¥15 做过dali2.0认证的技术,
  • ¥15 一道python难题
  • ¥15 matlab 免疫算法
  • ¥50 可视化界面构建,实现信息模块功能
  • ¥15 基于bert-base-chinese的中文文本处理
  • ¥15 高价求抖音抓包技术,抖音抓包无网络问题