2013-04-28 94 views
1

首先,這裏是代碼JPA和休眠 - 更新/合併一對多的關係

@Entity 
@SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq") 
public class QuestionSet { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "wordlist_seq") 
    private Long id; 

    @Constraints.Required 
    private String name; 

    @Constraints.Required 
    private String questionType; 

    @Constraints.Required 
    @ManyToOne 
    @PrimaryKeyJoinColumn 
    private User owner; 

    public String getQuestionType() { 
     return questionType; 
    } 

    public void setQuestionType(String questionType) { 
     this.questionType = questionType; 
    } 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<Question> questions; 
.... 

,這裏是一些樣本操作

@SecureSocial.SecuredAction 
@play.db.jpa.Transactional 
public static Result test(){ 
    QuestionSet set = questionSetDAO.findByID(QuestionSet.class, 100L); 
    List<Question> questions = new ArrayList<Question>(); 
    OpenQuestion question = new OpenQuestion(); 
    question.setQuestion("a"); 
    question.setAnswer("b"); 
    questions.add(question); 
    set.setQuestions(questions); 
    questionSetDAO.merge(set); 
    return ok(); 
} 

現在,當我更新的QuestionSet一些實例我從數據庫中提取它,創建新的問題列表(它可能包含一些新的無標記集,它可能包含現有標識符的問題 - 這些問題用於更新)。

現在,當我調用實體管理器的merge方法,我得到這個異常:

play.api.Application$$anon$1: Execution exception[[RollbackException: Error while committing the transaction]] 
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1] 
    at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:144) [play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:140) [play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1] 
javax.persistence.RollbackException: Error while committing the transaction 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] 
    at play.db.jpa.JPA.withTransaction(JPA.java:107) ~[play-java-jpa_2.10.jar:2.1.1] 
    at play.db.jpa.TransactionalAction.call(TransactionalAction.java:14) ~[play-java-jpa_2.10.jar:2.1.1] 
    at securesocial.core.java.SecureSocial$Secured.call(SecureSocial.java:218) ~[securesocial_2.10-master-SNAPSHOT.jar:master-SNAPSHOT] 
    at play.core.j.JavaAction$$anon$2.apply(JavaAction.scala:74) ~[play_2.10.jar:2.1.1] 
    at play.core.j.JavaAction$$anon$2.apply(JavaAction.scala:73) ~[play_2.10.jar:2.1.1] 
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1315) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81) ~[hibernate-entitymanager-3.6.9.Final.jar:3.6.9.Final] 
    at play.db.jpa.JPA.withTransaction(JPA.java:107) ~[play-java-jpa_2.10.jar:2.1.1] 
    at play.db.jpa.TransactionalAction.call(TransactionalAction.java:14) ~[play-java-jpa_2.10.jar:2.1.1] 
    at securesocial.core.java.SecureSocial$Secured.call(SecureSocial.java:218) ~[securesocial_2.10-master-SNAPSHOT.jar:master-SNAPSHOT] 
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
Caused by: org.h2.jdbc.JdbcBatchUpdateException: Referential integrity constraint violation: "FK415AFE694BC8D057: PUBLIC.QUESTIONSET_QUESTION FOREIGN KEY(QUESTIONS_ID) REFERENCES PUBLIC.QUESTION(ID) (200)"; SQL statement: 
insert into QuestionSet_Question (QuestionSet_id, questions_id) values (?, ?) [23506-168] 
    at org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1121) ~[h2.jar:1.3.168] 
    at com.jolbox.bonecp.StatementHandle.executeBatch(StatementHandle.java:469) ~[bonecp.jar:0.7.1.RELEASE] 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 

在我簡單的例子操作,問題集中不包含在開始任何問​​題,所以列表是空的。我想會照顧這種事情?

+0

「問題」是否包含映射到其父「問題集」?另外,在「QuestionSet」類中@OneToMany(cascade = CascadeType.ALL)私有列表問題;'應該有mappedBy; '@OneToMany(mappedBy =「questionSet」,cascade = CascadeType.ALL'私人列表問題; – Zaki 2013-04-28 13:24:11

+0

不,看起來我以前的註釋中有一些垃圾。 – Andna 2013-04-28 14:55:18

回答

1

我回答我自己的問題,因爲我發現我有一些從以前的註釋遺留下來,所以這個約束不應該存在我當前的模型。我清除了數據庫,現在一切正常。