この質問は何度も尋ねられ、私はすでにすべての提案を使用しましたが、それでもこのエラーが発生しています。
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>
私は障害について何の手掛かりも持っていません。
ありがとう。
解決:
@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。
@ManyToOne
列でも同じ問題が発生しました。それは解決された...愚かな方法で。パブリックgetterメソッドには他のすべてのアノテーションがありました。これらは親クラスからオーバーライドされたためです。しかし、最後のフィールドには、私のプロジェクトの他のすべてのクラスと同様に、プライベート変数の注釈が付けられています。だから私は理由なしで同じMappingException
を得た。
解決策:すべての注釈をパブリックgetterメソッドに配置しました。プライベートフィールドとパブリックゲッターのアノテーションが1つのクラスに混在している場合、Hibernateはケースを処理できないと思います。
@ElementCollection
をリストフィールドに追加すると、この問題は解決しました。
@Column
@ElementCollection(targetClass=Integer.class)
private List<Integer> countries;
私の推測では、Set<Role>
アノテーションが付けられたUser
クラスで@OneToMany
を使用しています。つまり、1つのUser
には多くのRole
があります。ただし、同じフィールドでは@Column
アノテーションを使用しますが、これは意味がありません。 1対多の関係は、個別の結合テーブルまたは多列の結合列(この場合はRoleクラス)を使用して管理されます。 @JoinColumn
の代わりに@Column
を使用すると、おそらく問題は解決しますが、意味的に間違っているようです。ロールとユーザーの関係は多対多である必要があります。
今日この問題があり、@ JoinTableアノテーションの上にある@ManyToManyアノテーションを誤って削除してしまったことを発見しました。
マッピングが正しいか間違っているとは言いませんが、hibernateはフィールドを宣言するセットのインスタンスが必要だと思います。
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
//@ElementCollection(targetClass=Role.class)
@Column(name = "ROLE_ID")
private Set<Role> roles = new HashSet<Role>();
私は同様の問題を抱えていたので、属性の上にいくつかのアノテーションとパブリックメソッドの上にいくつかのアノテーションを混在させていた問題を見つけました。私はそれらをすべて属性の上に置くだけで機能します。
セットをシリアル化しないために、ロールに@Transient
注釈を追加する必要がある場合があります。
Db列にマップされていないクラスのメンバーでエラーが発生し、別のエンティティのリストの単なるホルダーであるという同様の問題がありました。 ListをArrayListに変更すると、エラーはなくなりました。私は、マップされたエンティティで実際にそれを行うべきではないことを知っています。それがDTOの目的です。誰かがこのスレッドを見つけ、上記の答えが当てはまらない、または助けられない場合に備えて共有したかっただけです。