java外键对象_java – 级联将实体对象与外键一起保存为...

我想坚持我的QuestionCompletion类的对象与所有子元素.其中一个孩子有一个复合主键.作为这个主键的一部分,我也有另一个实体的外键.结果我得到这个错误:

Exception caught during request processing: javax.ejb.EJBTransactionRolledbackException:

could not set a field value by reflection setter of com.example.model.domain.QuestionCompletionAnswerPK.questionCompletionId

javax.ejb.EJBTransactionRolledbackException: could not set a field value by reflection

setter of com.example.model.domain.QuestionCompletionAnswerPK.questionCompletionId

最后一个“由…引起”当然是NullPointerException:

Caused by: java.lang.NullPointerException

这是我的代码的一部分.最后一行会导致错误.

QuestionCompletion questionCompletion = new QuestionCompletion();

List answers = new ArrayList();

for (;;) { // loop isn't important; it's loop for answers

ExtendedQuestion extendedQuestion = new ExtendedQuestion();

extendedQuestion.setId(extendedQuestionId); //extendedQuestionId is known to me in that place

for (;;) { // loop isn't important; it's loop for question answers

//questionCompletion and extendedQuestion are popualted here

QuestionCompletionAnswer questionCompletionAnswer = new QuestionCompletionAnswer();

questionCompletionAnswer.setQuestionCompletion(questionCompletion);

questionCompletionAnswer.setExtendedQuestion(extendedQuestion);

answers.add(questionCompletionAnswer);

}

}

questionCompletion.setAnswers(answers);

questionCompletionService.saveOrMerge(questionCompletion);

这是我的基本实体类,我想坚持其所有的子元素.我已经意识到List< QuestionCompletionAnswer>引起问题.我使用cascade = CascadeType.ALL来允许持久化子元素.

@javax.persistence.Entity

@org.hibernate.annotations.Entity(dynamicUpdate = true)

@Table(name = "question_completion")

public class QuestionCompletion implements Serializable {

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_completion_gen")

@SequenceGenerator(name = "question_completion_gen", sequenceName = "question_completion_id_seq")

@Column(name = "question_completion_id")

private Long id;

@OneToMany(cascade = CascadeType.ALL)

@JoinColumn(name = "extended_question_id")

protected List answers;

}

这是我的类 – QuestionCompletionAnswer类的主键.

@Embeddable

public class QuestionCompletionAnswerPK implements Serializable {

@Column(name = "question_completion_id")

protected Long questionCompletionId;

@Column(name = "extended_question_id")

protected Long extendedQuestionId;

}

这是使用我的EmbeddedId的类.属性问题ComplempleId和questionCompletionId是某些其他实体的外键,所以我在下面还用@MapsId注释放置了这些实体的整个对象.

@javax.persistence.Entity

@org.hibernate.annotations.Entity(dynamicUpdate = true)

@Table(name = "extended_question_answer")

public class QuestionCompletionAnswer implements Serializable {

@EmbeddedId

private QuestionCompletionAnswerPK id;

@ManyToOne

@MapsId(value = "questionCompletionId")

@JoinColumn(name = "question_completion_id", nullable = false, insertable = false, updatable = false)

protected QuestionCompletion questionCompletion;

@ManyToOne

@MapsId(value = "extendedQuestionId")

@JoinColumn(name = "extended_question_id", nullable = false, insertable = false, updatable = false)

protected ExtendedQuestion extendedQuestion;

}

你能告诉我我的注释是否正确吗?也许我混淆了一些方法.或者我不能在这种情况下坚持我的基本对象及其所有子元素.

编辑

现在我的映射看起来像:

@javax.persistence.Entity

@org.hibernate.annotations.Entity(dynamicUpdate = true)

@Table(name = "question_completion")

public class QuestionCompletion implements Serializable {

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_completion_gen")

@SequenceGenerator(name = "question_completion_gen", sequenceName = "question_completion_id_seq")

@Column(name = "question_completion_id")

private Long id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "questionCompletion")

protected List answers;

}

QuestionCompletionAnswerPK类的代码是相同的.

@javax.persistence.Entity

@org.hibernate.annotations.Entity(dynamicUpdate = true)

@Table(name = "extended_question_answer")

public class QuestionCompletionAnswer implements Serializable {

@EmbeddedId

private QuestionCompletionAnswerPK id;

@ManyToOne(cascade = CascadeType.PERSIST)

@MapsId(value = "questionCompletionId")

@JoinColumn(name = "question_completion_id", nullable = false)

protected QuestionCompletion questionCompletion;

@ManyToOne

@MapsId(value = "extendedQuestionId")

@JoinColumn(name = "extended_question_id", nullable = false)

protected ExtendedQuestion extendedQuestion;

}

通过该映射,我仍然得到相同的异常.

编辑#2

但是,当我以这种方式更改QuestionCompletionAnswer类时:

@javax.persistence.Entity

@org.hibernate.annotations.Entity(dynamicUpdate = true)

@Table(name = "extended_question_answer")

public class QuestionCompletionAnswer implements Serializable {

@EmbeddedId

private QuestionCompletionAnswerPK id;

@ManyToOne(cascade = CascadeType.PERSIST)

@JoinColumn(name = "question_completion_id", nullable = false, insertable = false, updatable = false)

protected QuestionCompletion questionCompletion;

@ManyToOne

@JoinColumn(name = "extended_question_id", nullable = false, insertable = false, updatable = false)

protected ExtendedQuestion extendedQuestion;

}

我得到了那个例外:

Caused by: org.hibernate.id.IdentifierGenerationException: null id generated

for:class com.example.model.domain.QuestionCompletionAnswer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值