Java 数据库包含集合中的重复项<;字符串>;

Java 数据库包含集合中的重复项<;字符串>;,java,jpa,entity,set,Java,Jpa,Entity,Set,在我的申请中,我拥有以下实体: @Entity public class Commentable implements Serializable { ... @ElementCollection(targetClass = String.class) protected Set<String> likers = new HashSet<String>(); ... } 数据库包含如下项: # | Commentable_ID |

在我的申请中,我拥有以下实体:

@Entity
public class Commentable implements Serializable {
    ... 
    @ElementCollection(targetClass = String.class)
    protected Set<String> likers = new HashSet<String>();
    ...
}
数据库包含如下项:

# |  Commentable_ID  |  LIKERS
1 |       1801       |  Mr.James
2 |       1801       |  Mr.James
3 |       1801       |  Mr.James
更新1:

正如JMelnik所建议的,我试图加入唯一的约束:

@Entity
public class Commentable implements Serializable {
    ... 
    @ElementCollection(targetClass = String.class)
    @Column(unique=true)
    protected Set<String> likers = new HashSet<String>();

    public void addLiker(String liker) {
        this.likers.add(liker);
    }
    ...
}
更新2:

在我的一个
SessionBean
中,我有以下方法来记录like:

@Override
public int like(long commentableID, String liker) {
    Commentable c = em.find(Commentable.class, commentableID);
    if (c == null) return STATUS_NOT_FOUND;
    else {
        c.addLiker(liker);
        return STATUS_SUCCESSFUL;
    }
}
如果您能告诉我为什么会发生这种情况,以及如何避免数据库中出现重复条目,我将不胜感激

致以最良好的祝愿


James Tran

我的猜测是,如果您将addLiker方法更改为

public void addLiker(String liker) {
    this.likers.size();
    this.likers.add(liker);
}
那就行了。我记得这是一个问题,但我认为它是固定的。你能试试2.4里程碑版本吗。否则,记录一个bug,或者查找并投票支持现有bug

您还应该能够修复它,使关系变得迫切,或者在实体中使用@ChangeTracking(DEFERRED)。 你也可以用

public void addLiker(String liker) {
    if (!this.likers.contains(liker)) {
        this.likers.add(liker);
    }
}

同一个可注释的用户名出现多次?请显示来自数据库的一些示例输出。尝试在@Column和数据库列(如果不是自动生成的表)上放置唯一约束。然后从数据库中删除重复的条目,然后尝试一些testdrive或smth。@我刚刚更新了我的帖子,这是您需要的吗?@JMelnik请查看上面我的更新。请提供代码,将项目添加到likers集中并将其持久化。
public void addLiker(String liker) {
    this.likers.size();
    this.likers.add(liker);
}
public void addLiker(String liker) {
    if (!this.likers.contains(liker)) {
        this.likers.add(liker);
    }
}