2012-03-21 16 views
0

私はかなり長い間このことに苦労してきましたが、Googleで具体的な回答を得られませんでした。私は、アルバムとユーザーの間に多面的な関係を持っています。そのために、結合テーブルには追加のフィールド「ロール」が定義されています。具体的な実装:hibernate注釈:java.util.Setクラスのプロパティemptyのセッターを見つけることができませんでした

User class : 

@Entity 
@Table(name="USERS") 

public class User { 

private long id; 
private String userName; 
private String password; 
private String mailAddress; 
private Set<AlbumUser> albumUsers; 

// Getters 
/** 
* @return the id 
*/ 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
public long getId() { 
    return id; 
} 

/** 
* @return the userName 
*/ 
public String getUserName() { 
    return userName; 
} 


/** 
* @return the password 
*/ 
@Type(type="encryptedString") 
public String getPassword() { 
    return password; 
} 


/** 
* @return the mailAddress 
*/ 
public String getMailAddress() { 
    return mailAddress; 
} 

// Setters 

/** 
* @param id the id to set 
*/ 
public void setId(long id) { 
    this.id = id; 
} 

/** 
* @param userName the userName to set 
*/ 
public void setUserName(String userName) { 
    this.userName = userName; 
} 

/** 
* @param password the password to set 
*/ 
public void setPassword(String password) { 
    this.password = password; 
} 

/** 
* @param mailAddress the mailAddress to set 
*/ 
public void setMailAddress(String mailAddress) { 
    this.mailAddress = mailAddress; 
} 

public String toString() 
{ 
    return ("User : " + getUserName()); 
} 

/** 
* @return the albumUsers 
*/ 
//----bidirectional association 
@Transient 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user") 
public Set<AlbumUser> getAlbumUsers() { 
    return albumUsers; 
} 

/** 
* @param albumUsers the albumUsers to set 
*/ 
public void setAlbumUsers(Set<AlbumUser> albumUsers) { 
    this.albumUsers = albumUsers; 
} 
} 

AlbumUser class : 

@Entity 
@Table(name = "ALBUMS_USERS") 
@AssociationOverrides({ 
@AssociationOverride(name = "pk.album", [email protected](name="album_id")), 
@AssociationOverride(name = "pk.user", [email protected](name="user_id"))}) 

public class AlbumUser { 

private AlbumUserPK pk = new AlbumUserPK(); 
private Role role; 

@EmbeddedId 
private AlbumUserPK getPk() 
{ 
    return pk; 
} 

private void setPk(AlbumUserPK pk) 
{ 
    this.pk = pk; 
} 

public void setAlbum(Album album) { 
    getPk().setAlbum(album); 
} 

@Transient 
public Album getAlbum() { 
    return getPk().getAlbum(); 
} 

public void setUser(User user) { 
    getPk().setUser(user); 
} 

@Transient 
public User getUser() { 
    return getPk().getUser(); 
} 

/** 
* @return the role 
*/ 
@Enumerated(EnumType.STRING) 
public Role getRole() { 
    return role; 
} 

/** 
* @param role 
*   the role to set 
*/ 
public void setRole(Role role) { 
    this.role = role; 
} 
} 

@Embeddable 
class AlbumUserPK implements Serializable { 

private Album album; 


private User user; 

/** 
* @return the album 
*/ 
@ManyToOne 
public Album getAlbum() { 
    return album; 
} 

/** 
* @param album 
*   the album to set 
*/ 
public void setAlbum(Album album) { 
    this.album = album; 
} 

/** 
* @return the user 
*/ 
@ManyToOne 
public User getUser() { 
    return user; 
} 

/** 
* @param user 
*   the user to set 
*/ 
public void setUser(User user) { 
    this.user = user; 
} 
} 

私が読んで/挿入しようとするたびに/ ...ユーザー、私は次のエラーを取得する:

org.hibernate.PropertyNotFoundException:内の空のプロパティのセッターが見つかりませんでしたクラスjava.util.Set

これは、AlbumUsersのセットと関係があると思いますが、私はUserクラスを維持しています...このフィールドを一時的にしようとしましたが、役に立たないものです...

誰も同じようなエラーに遭遇しましたか?

おかげで...

答えて

1

はジェネリックずにセットを使用してみてください。

public void setAlbumUsers(Set albumUsers) { 
    this.albumUsers = albumUsers; 
} 

ゲッターも

や問題@Transientゲッターにすることができます。

+0

ありがとうございますが、どちらもうまくいきませんでした。私はこの解決策に従おうとしました:http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns私には妥当と思われました。心に浮かんでいる唯一の事は、私は間違った関係を持っているということです。ほとんどの例では、実際のユーザーを保存する前にalbumUserを作成しますが、これは嫌です。ユーザーはアルバムを持っていなくても登録/ログインできるはずです。つまり、アルバムの参照はありません... –

+0

実際には、これは私が使ったチュートリアルでした:http://www.mkyong.com/hibernate/hibernate-many-to-many- example-join-table-extra-column-annotation / –

関連する問題