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条)

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd