hibernate批注:在类java.util.Set中找不到属性为空的setter

hibernate批注:在类java.util.Set中找不到属性为空的setter,hibernate,Hibernate,我已经为此挣扎了很长一段时间,在谷歌上没有得到任何具体的答案。我在相册和用户之间有多对多关系,为此,联接表定义了一个额外的字段“角色”。具体实施: User class : @Entity @Table(name="USERS") public class User { private long id; private String userName; private String password; private String mailAddress; private Set<A

我已经为此挣扎了很长一段时间,在谷歌上没有得到任何具体的答案。我在相册和用户之间有多对多关系,为此,联接表定义了一个额外的字段“角色”。具体实施:

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", joinColumns=@JoinColumn(name="album_id")),
@AssociationOverride(name = "pk.user", joinColumns=@JoinColumn(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;
}
}
用户类:
@实体
@表(name=“USERS”)
公共类用户{
私人长id;
私有字符串用户名;
私有字符串密码;
私有字符串邮件地址;
私人用户;
//吸气剂
/**
*@返回id
*/
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
/**
*@返回用户名
*/
公共字符串getUserName(){
返回用户名;
}
/**
*@返回密码
*/
@类型(Type=“encryptedString”)
公共字符串getPassword(){
返回密码;
}
/**
*@返回邮件地址
*/
公共字符串getMailAddress(){
返回邮件地址;
}
//二传手
/**
*@param id要设置的id
*/
公共无效集合id(长id){
this.id=id;
}
/**
*@param userName要设置的用户名
*/
public void setUserName(字符串用户名){
this.userName=用户名;
}
/**
*@param password要设置的密码
*/
public void setPassword(字符串密码){
this.password=密码;
}
/**
*@param mailAddress要设置的邮件地址
*/
公共无效setMailAddress(字符串mailAddress){
this.mailAddress=mailAddress;
}
公共字符串toString()
{
返回(“用户:+getUserName());
}
/**
*@返回相册用户
*/
//----双向联想
@短暂的
@OneToMany(fetch=FetchType.LAZY,mappedBy=“pk.user”)
公共集getAlbumUsers(){
返回用户;
}
/**
*@param albumUsers要设置的albumUsers
*/
public void setAlbumUsers(Set albumUsers){
this.albumUsers=albumUsers;
}
}
AlbumUser类:
@实体
@表(name=“相册用户”)
@联想超越({
@AssociationOverride(name=“pk.album”,joinColumns=@JoinColumn(name=“album\u id”),
@AssociationOverride(name=“pk.user”,joinColumns=@JoinColumn(name=“user\u id”))})
公共类用户{
私有AlbumUserPK=新AlbumUserPK();
私人角色;
@嵌入ID
私有相册userpk getPk()
{
返回主键;
}
私有void setPk(AlbumUserPK)
{
this.pk=pk;
}
公共无效设置相册(相册){
getPk().setAlbum(相册);
}
@短暂的
公共相册getAlbum(){
返回getPk().getAlbum();
}
公共void setUser(用户){
getPk().setUser(用户);
}
@短暂的
公共用户getUser(){
返回getPk().getUser();
}
/**
*@返回角色
*/
@枚举(EnumType.STRING)
公共角色getRole(){
返回角色;
}
/**
*@param角色
*要设置的角色
*/
public void setRole(角色角色){
this.role=角色;
}
}
@可嵌入
类AlbumUserPK实现可序列化{
私人相册;
私人用户;
/**
*@归还相册
*/
@许多酮
公共相册getAlbum(){
返回相册;
}
/**
*@param相册
*要设置的相册
*/
公共无效设置相册(相册){
this.album=相册;
}
/**
*@返回用户
*/
@许多酮
公共用户getUser(){
返回用户;
}
/**
*@param用户
*要设置的用户
*/
公共void setUser(用户){
this.user=用户;
}
}
每当我尝试插入/读取/。。。作为用户,我得到以下错误:

org.hibernate.PropertyNotFoundException:在类java.util.Set中找不到属性为空的setter

我想这与AlbumUsers的集合有关,我一直在用户类中。。。我试着让这个磁场暂时消失,但没用

有没有人遇到过类似的错误


谢谢…

尝试使用不带泛型的Set

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


或者,问题可能出现在
@Transient
getter中

谢谢你的建议,但两者都不起作用。我试图遵循这个解决方案:这对我来说似乎是合理的。我唯一想到的是,我有错误的联想。大多数示例都会在保存实际用户之前创建一个albumUser,我不希望这样。用户应该能够在没有相册的情况下注册/登录,因此没有相册用户参考…实际上,这是我使用的教程: