【问题标题】:Hibernate mappedby composite keyHibernate 由复合键映射
【发布时间】:2013-05-30 08:04:41
【问题描述】:

我想在@OneToMany 中使用映射,但它会引发异常

org.hibernate.MappingException: Unable to read the mapped by attribute for moduleRoles in org.caau.entity.UserModuleRole!

这是我的实体映射。UserModuleRole是复合类。如果使用注释代码,程序是正确的。有人帮我解决吗?

@Entity
@Table(name = "user")
public class User{
    private long id;
    private Set<UserModuleRole> moduleRoles;

    @Id
    @Column(name = "id", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getId() {
        return id;
    }

    @OneToMany(fetch = FetchType.EAGER,mappedBy="user")
    //if use under code,program is correct,but i want to use mappedBy!
    //@OneToMany(fetch = FetchType.EAGER)
    //@JoinColumn(name = "user_id")
    public Set<UserModuleRole> getModuleRoles() {
        return moduleRoles;
    }

}

这里是 UserModuleRole 类

 @Entity
    @Table(name = "user_module_role")
    @IdClass(UserModuleRolePK.class)
        public class UserModuleRole{
        private User user;
        private ModuleRole moduleRole;
        private long addUserId;
        private Date addDate;
        private long updateUserId;
        private Date updateDate;

        @Id
        public User getUser() {
            return user;
        }

        @Id
        public ModuleRole getModuleRole() {
            return moduleRole;
        }
    }
    class UserModuleRolePK implements Serializable {

        private static final long serialVersionUID = -9132981262254922539L;

        private User user;
        private ModuleRole moduleRole;

        @ManyToOne
        @JoinColumn(name = "user_id", nullable = false)
        public User getUser() {
            return user;
        }

        @ManyToOne
        @JoinColumns({ @JoinColumn(name = "module_id", nullable = false), @JoinColumn(name = "role_id", nullable = false) })
        public ModuleRole getModuleRole() {
            return moduleRole;
        }
    }
    }

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    首先,您遇到的异常是由于您的 UserModuleRole 类中没有任何名为 user 的关系属性。

    您要实现的是您的实体UserModuleRole 之间的多对多 关系,在您的示例中不需要中间类UserModuleRole 作为唯一的它拥有的字段/属性是对其他两个实体的外键引用。

    除非您忘记在问题中添加更多信息,否则您应该使用的映射要简单得多,如下所示:

    @Entity
    public class ModuleRole {
    
        private Long id;
    
        private Set<User> users;
    
        @Id
        @Column(name = "id")
        public Long getId() {
            return id;
        }
    
        @ManyToMany
        @JoinTable(name = "user_module_role", 
            joinColumns = @JoinColumn(name = "module_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "user_id"), referencedColumnName = "id")
        public Set<Users> getUsers() {
            return users;
        }
    
    }
    
    @Entity
    @Table(name = "user")
    public class User{
        private Long id;
        private Set<ModuleRole> moduleRoles;
    
        @Id
        @Column(name = "id", nullable = false)
        @GeneratedValue(strategy = GenerationType.AUTO)
        public long getId() {
            return id;
        }
    
        @ManyToMany(mappedBy = "users")
        public Set<ModuleRole> getModuleRoles() {
            return moduleRoles;
        }
    
    }
    

    Hibernate 将自行处理中间表,除非您想向关系中添加其他字段,否则您不必担心它,在这种情况下 this tutorial 会有所帮助。

    【讨论】:

    • 但我的 user_module_role 有其他字段创建表 user_module_role( user_id int unsigned not null, module_id int unsigned not null, role_id int unsigned not null, add_user_id int unsigned default 1, add_date datetime default '1970/01/ 01', update_user_id int unsigned default 1, update_date datetime default '1970/01/01');
    • 您是否查看了我在答案末尾放置的教程的链接?
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-08-19
    相关资源
    最近更新 更多