web-dev-qa-db-ja.com

org.hibernate.MappingException:Java.util.Setのタイプを判別できませんでした

この質問は何度も尋ねられ、私はすでにすべての提案を使用しましたが、それでもこのエラーが発生しています。

User.Javaは

@Entity
@Table(name = "USER")
public class User implements UserDetails, Serializable {

    private static final long serialVersionUID = 2L;

    @Id
    @Column(name = "USER_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "USERNAME")
    private String username;
    @Column(name = "PASSWORD")
    private String password;
    @Column(name = "NAME")
    private String name;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "LOCKED")
    private boolean locked;
    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @ElementCollection(targetClass=Role.class)
    @Column(name = "ROLE_ID")
    private Set<Role> roles;

    @Override
    public GrantedAuthority[] getAuthorities() {
        List<GrantedAuthorityImpl> list = new ArrayList<GrantedAuthorityImpl>(0);
        for (Role role : roles) {
            list.add(new GrantedAuthorityImpl(role.getRole()));
        }
        return (GrantedAuthority[]) list.toArray(new GrantedAuthority[list.size()]);
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return !isLocked();
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isLocked() {
        return locked;
    }

    public void setLocked(boolean locked) {
        this.locked = locked;
    }

    @Override
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    public Set<Role> getRoles() {
        return roles;
    }
}

そして、Role.Javaは

@Entity
@Table(name="ROLE")
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ROLE_ID")
    private long id;
    @Column(name="USERNAME")
    private String username;
    @Column(name="ROLE")
    private String role;


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

これは、JPAを使用した休止状態アノテーションの最初の試みです。したがって、提案は非常に役立ちます。

Hibernateの場合、pom.xmlの依存関係は次のとおりです。

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.5.4-Final</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.5.4-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.5.4-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>3.1.0.GA</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.5.4-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

私は障害について何の手掛かりも持っていません。

ありがとう。

76
Tapas Bose

解決:

@Entity
@Table(name = "USER")
@Access(AccessType.FIELD)
public class User implements UserDetails, Serializable {

    private static final long serialVersionUID = 2L;

    @Id
    @Column(name = "USER_ID", updatable=false, nullable=false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "USERNAME")
    private String username;

    @Column(name = "PASSWORD")
    private String password;

    @Column(name = "NAME")
    private String name;

    @Column(name = "EMAIL")
    private String email;

    @Column(name = "LOCKED")
    private boolean locked;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = Role.class)
    @JoinTable(name = "USER_ROLE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private Set<Role> roles;

    @Override
    public GrantedAuthority[] getAuthorities() {
        List<GrantedAuthorityImpl> list = new ArrayList<GrantedAuthorityImpl>(0);
        for (Role role : roles) {
            list.add(new GrantedAuthorityImpl(role.getRole()));
        }
        return (GrantedAuthority[]) list.toArray(new GrantedAuthority[list.size()]);
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return !isLocked();
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Override
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isLocked() {
        return locked;
    }

    public void setLocked(boolean locked) {
        this.locked = locked;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

上記と同じRole.Java。

5
Tapas Bose

@ManyToOne列でも同じ問題が発生しました。それは解決された...愚かな方法で。パブリックgetterメソッドには他のすべてのアノテーションがありました。これらは親クラスからオーバーライドされたためです。しかし、最後のフィールドには、私のプロジェクトの他のすべてのクラスと同様に、プライベート変数の注釈が付けられています。だから私は理由なしで同じMappingExceptionを得た。

解決策:すべての注釈をパブリックgetterメソッドに配置しました。プライベートフィールドとパブリックゲッターのアノテーションが1つのクラスに混在している場合、Hibernateはケースを処理できないと思います。

79
Avadhuta

@ElementCollectionをリストフィールドに追加すると、この問題は解決しました。

@Column
@ElementCollection(targetClass=Integer.class)
private List<Integer> countries;
45
Biggy_java2

私の推測では、Set<Role>アノテーションが付けられたUserクラスで@OneToManyを使用しています。つまり、1つのUserには多くのRoleがあります。ただし、同じフィールドでは@Columnアノテーションを使用しますが、これは意味がありません。 1対多の関係は、個別の結合テーブルまたは多列の結合列(この場合はRoleクラス)を使用して管理されます。 @JoinColumnの代わりに@Columnを使用すると、おそらく問題は解決しますが、意味的に間違っているようです。ロールとユーザーの関係は多対多である必要があります。

15
whiskeysierra

今日この問題があり、@ JoinTableアノテーションの上にある@ManyToManyアノテーションを誤って削除してしまったことを発見しました。

6
Mark

マッピングが正しいか間違っているとは言いませんが、hibernateはフィールドを宣言するセットのインスタンスが必要だと思います。

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
//@ElementCollection(targetClass=Role.class)
@Column(name = "ROLE_ID")
private Set<Role> roles = new HashSet<Role>();
4
Konstantin

私は同様の問題を抱えていたので、属性の上にいくつかのアノテーションとパブリックメソッドの上にいくつかのアノテーションを混在させていた問題を見つけました。私はそれらをすべて属性の上に置くだけで機能します。

3

セットをシリアル化しないために、ロールに@Transient注釈を追加する必要がある場合があります。

なぜJavaには一時フィールドがあるのですか?

2
Mark

Db列にマップされていないクラスのメンバーでエラーが発生し、別のエンティティのリストの単なるホルダーであるという同様の問題がありました。 ListをArrayListに変更すると、エラーはなくなりました。私は、マップされたエンティティで実際にそれを行うべきではないことを知っています。それがDTOの目的です。誰かがこのスレッドを見つけ、上記の答えが当てはまらない、または助けられない場合に備えて共有したかっただけです。

0
Ginja Ninja