我正在使用spring数据jpa,hibernate和MySql来练习我自己的一个例子。
如何在同一个对象上建立ManyToMany关系?
例如,朋友类可以有很多朋友到目前为止,我已经完成了,
用户朋友映射表
CREATE TABLE if not exists `user_friends` (
`user_id` int(6) NOT NULL,
`frnd_id` int(6) NOT NULL,
PRIMARY KEY (`user_id`, `frnd_id`),
INDEX `FK_USER_FRNDS` (`frnd_id`),
CONSTRAINT `FK_USER` FOREIGN KEY (`user_id`) REFERENCES `personalDetails` (`user_id`),
CONSTRAINT `FK_USER_FRNDS` FOREIGN KEY (`frnd_id`) REFERENCES `personalDetails` (`user_id`)
);
PersonalDetails 类
@Entity
@Table(name="personalDetails")
public class PersonalDetails implements Serializable{
@Id
@GeneratedValue(generator="gen")
@Column(name="user_id", unique=true)
private Long id;
@ManyToMany(cascade={CascadeType.ALL}, fetch= FetchType.LAZY)
@JoinTable(name="user_friends",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="frnd_id")})
private Set<PersonalDetails> friends = new HashSet<PersonalDetails>();
@ManyToMany(mappedBy="friends")
private Set<PersonalDetails> friendsMapper;
//getters and setters
}
并在我的控制器中调用PersonalDetails服务类更新方法,如下所示:
public String joinFriend(@PathVariable Long frndId, Principal principal) throws PersonalDetailsNotFound, UserNotFoundException{
logger.info("Get came to /user/frnd/join.html");
if(frndId!=null){
logger.info("Going to add friend..");
PersonalDetails persUser = userService.findByUsername(principal.getName()).getPersonalDetails();
PersonalDetails pFrnd = userService.findById(frndId).getPersonalDetails();
persUser.getFriends().add(pFrnd);
personalDetailService.update(persUser);
}
它正在抛出这个异常
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '19' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
... 93 more
任何帮助表示赞赏..
答案 0 :(得分:2)
根据此错误消息,数据库中已存在具有相同主键的条目:
MySQLIntegrityConstraintViolationException: Duplicate entry '19' for key 'PRIMARY'
尝试清理数据库,或者如果使用序列生成id,请重新创建序列,使其值大于表中的最大ID。