![](/img/trans.png)
[英]save the object using Hibernate object references an unsaved transient instance save the transient instance before flushing
[英]HIbernate - object references an unsaved transient instance - save the transient instance before flushing
HIbernate - 必須在調用 save 之前手動分配此類的 ID
對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例
我的 xhtml 頁面中有一個下拉選項。 有時用戶需要選擇這個下拉菜單,
有時他不需要選擇下拉值。
我有兩個相關的實體,一個是主表,主表中的列(NULL)有一個引用表。 我正在嘗試將數據保存在表中。
錯誤是: 引起: javax.el.ELException: /jsf/submit.xhtml @20,76 listener="#{BankLocationMB.saveLocation}" 對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例
嘗試添加級聯 Persist 我收到以下錯誤
org.springframework.orm.jpa.JpaSystemException: org.hibernate.id.IdentifierGenerationException: 必須在調用 save() 之前手動分配此類的 ids: bank.entity.BankLocation.RefLoan; 嵌套異常是 javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: 必須在調用 save() 之前手動分配此類的 ids: bank.entity.BankLocation.RefLoan
@Entity
@Table(name = "BANK_LOCATION", schema = "OWNR")
public class BankLocation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "BANK_LOCATION_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BANK_LOCATION_ID_SEQ")
@SequenceGenerator(name = "BANK_LOCATION_ID_SEQ", sequenceName = "OWNR.BANK_LOCATION_ID_SEQ", allocationSize = 1)
private Long bankLocationId;
@Size(max = 32)
@Column(name = "BANK_NAME")
private String bankName;
@JoinColumn(name = "LOAN_ID", referencedColumnName = "LOAN_ID", insertable = false, updatable = false)
@ManyToOne(targetEntity=RefLoan.class, optional = true)
private RefLoan loan;
public RefLoan getLoan() {
return loan;
}
public void setLoan(RefLoan loan) {
this.loan = loan;
}
@Override
public int hashCode() {
int hash = 0;
hash += (bankLocationId != null ? bankLocationId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof BankLocation)) {
return false;
}
BankLocation other = (BankLocation) object;
if ((this.bankLocationId == null && other.bankLocationId != null) || (this.bankLocationId != null && !this.bankLocationId.equals(other.bankLocationId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "bank.entity.BankLocation[ bankLocationId=" + bankLocationId + " ]";
}
}
引用表實體
@Entity
@Table(name = "REF_LOAN", schema = "OWNR")
public class RefLoan implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "LOAN_ID")
private Integer loanId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50)
@Column(name = "DISPLAY_NAME")
private String displayName;
@Size(max = 50)
@Column(name = "DESCRIPTION")
private String description;
public RefLoan() {
}
public RefLoan(Integer loanId) {
this.loanId = loanId;
}
public RefLoan(Integer loanId, String displayName) {
this.loanId = loanId;
this.displayName = displayName;
}
public Integer getLoanId() {
return loanId;
}
public void setLoanId(Integer loanId) {
this.loanId = loanId;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public int hashCode() {
int hash = 0;
hash += (loanId != null ? loanId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (!(object instanceof RefLoan)) {
return false;
}
RefLoan other = (RefLoan) object;
if ((this.loanId == null && other.loanId != null) || (this.loanId != null && !this.loanId.equals(other.loanId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "bank.entity.RefLoan[ loanId=" + loanId + " ]";
}
}
任何人都可以提供修復我出錯的地方嗎?
謝謝
這是錯誤消息的重要部分: ids for this class must be manually assigned before calling save(): bank.entity.BankLocation.RefLoan
在您的Refloan
類中,ID 未標記為自動生成:
@Id
@Basic(optional = false)
@NotNull
@Column(name = "LOAN_ID")
private Integer loanId;
您需要添加您在 BankLocation 類中使用過的注釋(相應地調整序列名稱后)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BANK_LOCATION_ID_SEQ")
@SequenceGenerator(name = "BANK_LOCATION_ID_SEQ", sequenceName = "OWNR.BANK_LOCATION_ID_SEQ", allocationSize = 1)
您可能有一些類似於以下內容的代碼:
entityManager.merge(bankLocation);
您將不得不使用貸款的托管參考,如下所示:
if (bankLocation.getRefLoan() != null) {
bankLocation.setRefLoan(entityManager.getReference(RefLoan.class, bankLocation.getRefLoan().getId());
}
entityManager.merge(bankLocation);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.