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 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊