簡體   English   中英

通過復合鍵映射的Hibernate

[英]Hibernate mappedby composite key

我想在@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;
        }
    }
    }

首先,您得到的異常是由於在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將自己處理中介表,除非您想向關系中添加其他字段,否則您不必擔心它,在這種情況下, 本教程會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM