【发布时间】:2022-01-27 01:19:59
【问题描述】:
在尝试获取父实体 (Msg) 的实体时尝试持久化子实体 (MsgRetry) 时出错,其中父 PK (msg_id) 是子实体中的 FK。
类似的错误:org.hibernate.id.IdentifierGenerationException: 试图从空的一对一属性分配 id
父实体不需要知道子实体(至少我认为它不需要知道)。一旦子实体被持久化,我也试图持久化父实体。我可以通过在子实体中没有父实体并调用关联的存储库来解决这个问题。但是,我认为它不像我正在尝试的那样干净,但显然更困难/复杂。
感谢您就最佳实践或如果这是一个好的解决方案如何实现这一目标提供任何建议。
表格:
| msg | |
|---|---|
| msg_id | pk |
| msg_status | msg_status |
| msg_retry | |
|---|---|
| msg_id | fk |
| count | |
| timestamp |
型号:
@Entity
@Table(name="msg")
public class Msg {
@Id
@Column(name = "msg_id")
@GeneratedValue(strategy = generationtype.sequence, generator = "msg_id_seq_gen")
@SequenceGenerator(name = "msg_id_seq_gen", sequencename = "msg_id_seq", allocationsize = 1)
private Long msgId;
@Column(name = "msg_status", nullable = false)
private String msgStatus;
...
//getters setters
}
@Entity
@Table(name = "msg_retry")
public class MsgRetry implements Serializable{
private static final long serialVersionUID = -7637385223556379976L;
@Id
@Column(name = "msg_id")
private Long msgId;
@OneToOne
@JoinColumn(name="msg_id", referencedColumnName = "msg_id")
private Msg msg;
@Column(name = "count")
private Long count;
@Generated(value = GenerationTime.ALWAYS)
@Column(name = "timestamp")
private Date timestamp;
public MsgRetry() {
}
public MsgRetry(Msg msg, Long count) {
this.msg = msg;
this.count = count;
}
public MsgRetry(Long msgId, Long count) {
this.msgId = msgId;
this.count = count;
}
public Msg getMsg() {
return msg;
}
public void setMsg(Msg msg) {
this.msg = msg;
}
@Repository
public interface MsgRetryRepository extends JpaRepository<MsgRetry, Long>{
}
@Test
public void testSaveMsgByMsgIdRetry() {
msgRetryRepository.deleteAll();
List<Msg> msgs = msgRepository.findAll();
MsgRetry msgRetry = new MsgRetry(msgs.get(0).getMsgId(), 1L);
msgRetry = msgRetryRepository.save(msgRetry);
assertNotNull(msgRetry.getMsg()); // fails to load Msg entity
LOG.info("msgRetry: {}", msgRetry);
}
@Test
public void testSaveMsgRetryByMsg() {
msgRetryRepository.deleteAll();
List<Msg> msgs = msgRepository.findAll();
MsgRetry msgRetry = new MsgRetry(msgs.get(0), 1L);
msgRetry = msgRetryRepository.save(msgRetry);
assertNotNull(msgRetry.getMsg());
LOG.info("msgRetry: {}", msgRetry);
}
错误输出:org.springframework.orm.jpa.JpaSystemException:必须在调用 save() 之前手动分配此类的 ID:msgtest.MsgRetry;
【问题讨论】:
标签: java hibernate jpa spring-data-jpa