1

複合主キー (indId、studentId) を持つエンティティ Student があります。このテーブルのいくつかの行を更新したいと思います。私のコード:

private EntityManager em = null;

@PersistenceContext
public void setEntityMgr(EntityManager em) {
    this.em = em;
}

public void updateStudent(Student student){
    em.merge(student);
}

このコードが実行されると、挿入クエリが実行されます (したがって、挿入であるため、主キーが既に存在する場合は例外がスローされます)。複合主キーを使用する場合、(JPA を使用して) 更新クエリを作成する方法がわかりません。提案を探しています。ありがとう。

編集

@Entity
@Table(name="student")
public class Student {
    private Integer studentId;
    private Long indId;
    private Integer field1; 
    private Integer field2;

@Id
@Column(name="student_id")
public Integer getStudentId() {
    return student;
}

@Id
@Column(name="ind_id")
public Long getIndId() {
    return indId;
}

//rest of the getters and setters
}


public class StudentBean{
 // properties 

    public void update(){
    Student student = new Student();
    student.setIndId(this.getIndId());
    student.setStudentId(this.getStudentId());
    .
    .

    // have a service class which I did not include
    studentDao.updateStudent(student)
   }

   // getters and setters

}

@Repository("StudentDao")
public class StudentDao{
    private EntityManager em = null;

    @PersistenceContext
    public void setEntityMgr(EntityManager em) {
         this.em = em;
    }

    public void updateStudent(Student student){
          em.merge(student);
    }
 }


Stacktrace (where indId = 117 and studentId = 1)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:   Duplicate entry '117-1' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
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:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
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.executeBatchSerially(PreparedStatement.java:2006)
... 98 more
4

1 に答える 1

3

Studentエンティティに 2 つのカラムで構成される主キーが実際にある場合は、@EmbeddedIdアノテーションを使用し、@Embeddableクラスを使用して主キーの 2 つのフィールドを保持する必要があります。

于 2013-09-17T22:36:04.990 に答える