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);
}
}