java hibernate更新_java – Hibernate saveOrUpdate()尝试在应该更新时保存

我有一个名为IssueParticipant的Hibernate实体.它基本上描述了用户和问题之间的关系(类似于JIRA或Bugzilla问题).它表示数据库中的一种多对多链接表,将用户ID链接到问题ID,但还包括与通知设置相关的其他信息,因此将其视为自己的实体.

我使用userId和issueId作为复合键时遇到了很大的问题,因此我创建了一个合成键,它是一个String(和postgres数据库中的varchar),形成如下:_.

现在,我有一个屏幕,用户可以编辑与问题相关的所有用户,同时还可以编辑通知设置.在控制器类中,我创建一个IssueParticipants列表,如下所示:

IssueParticipant participant = new IssueParticipant();

participant.setUser(accountUser);

participant.setIssue(issue);

所以这些当然不是由Hibernate管理的.

然后在我的DAO中,我遍历它们并调用saveOrUpdate(),期望如果数据库中存在具有相同合成密钥的IssueParticipant,它将更新;否则将被插入:

for (IssueParticipant participant : participants) {

getCurrentSession().saveOrUpdate(participant);

savedIds.add(participant.getIssueUserKey());

}

(savedIds是我正在维护的列表,以便稍后我将知道我应该从数据库中删除哪些IssueParticipants).

而不是我期望的,我得到一个例外:

org.postgresql.util.PsqlException: ERROR: duplicate key value violates unique constraint "issue_participant_pkey"

这是我的实体类,缩写为:

public class IssueParticipant extends Entity {

private String issueUserKey;

private Long issueId;

private Long userId;

// Edit: adding 'dateAdded' definition

private Date dateAdded;

// ...

// below may be null

private SPUser user;

private Issue issue;

public static IssueParticipant nulledIssueParticipant() {

IssueParticipant ip = new IssueParticipant();

return ip;

}

public String getIssueUserKey() {

return issueUserKey;

}

public void setIssueUserKey(String issueUserKey) {

this.issueUserKey = issueUserKey;

}

public Long getId() {

// currently meaningless

return 0L;

}

public Long getIssueId() {

return this.issueId;

}

public void setIssueId(Long issueId) {

this.issueId = issueId;

updateKey();

}

public Long getUserId() {

return this.userId;

}

public void setUserId(Long userId) {

this.userId = userId;

updateKey();

}

private void updateKey() {

issueUserKey = getIssueId() + KEY_SEP + getUserId();

}

public SPUser getUser() {

return user;

}

public void setUser(SPUser user) {

this.user = user;

setUserId(user.getId());

}

public Issue getIssue() {

return issue;

}

public void setIssue(Issue issue) {

this.issue = issue;

setIssueId(issue.getId());

}

// edit: adding 'dateAdded' methods

public Date getDateAdded() {

return dateAdded;

}

public void setDateAdded(Date dateAdded) {

this.dateAdded = dateAdded;

}

...

}

这是它的hbm文件:

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

实际上user_issue_key是相应数据库表中的主键.

在这种情况下,我觉得正确的解决方案可能就是使用SpringJDBC,但我真的很想知道这里发生了什么.有人有什么想法?提前致谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值