ManyToMany映射同一个对象在更新时抛出异常

时间:2014-02-02 06:28:43

标签: hibernate java-ee spring-data-jpa

我正在使用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

任何帮助表示赞赏..

1 个答案:

答案 0 :(得分:2)

根据此错误消息,数据库中已存在具有相同主键的条目:

MySQLIntegrityConstraintViolationException: Duplicate entry '19' for key 'PRIMARY'

尝试清理数据库,或者如果使用序列生成id,请重新创建序列,使其值大于表中的最大ID。