0

オブジェクト Municipio を永続化しようとすると、例外が発生します。Municipio には、Provincia との manyTone 関係と、Sector との別の manyToOne 関係があります。Provincia は null にできませんが、Sector は null にできます。オブジェクト Municipio を保存しようとすると例外がスローされるため、Sector を null にできるようにする方法がわかりません。

java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: es.caib.biocides.persistence.Municipio.sector -> es.caib.biocides.persistence.Sector
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:611)
at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:513)

ムニチピオ

/**
* The persistent class for the BCD_MUNICIPIO database table.
* 
*/
@Entity
@Table(name="BCD_MUNICIPIO")
public class Municipio implements Serializable {

@Id
@SequenceGenerator(name="BCD_MUNICIPIO_MUNCODIGO_GENERATOR", sequenceName="BCD_MUN_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="BCD_MUNICIPIO_MUNCODIGO_GENERATOR")
@Column(name="MUN_CODIGO")
private Long munCodigo;

@Column(name="MUN_NOMBRE")
private String munNombre;

//bi-directional many-to-one association to Provincia
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="MUN_CODPRV")
private Provincia provincia;

//bi-directional many-to-one association to Sector
@ManyToOne(fetch=FetchType.LAZY, optional=true)
@JoinColumn(name="MUN_CODSEC", nullable=true)
private Sector sector;

public Municipio() {
}

public Long getMunCodigo() {
    return this.munCodigo;
}

public void setMunCodigo(Long munCodigo) {
    this.munCodigo = munCodigo;
}

public String getMunNombre() {
    return this.munNombre;
}

public void setMunNombre(String munNombre) {
    this.munNombre = munNombre;
}

public Provincia getProvincia() {
    return this.provincia;
}

public void setProvincia(Provincia provincia) {
    this.provincia = provincia;
}

public Sector getSector() {
    return this.sector;
}

public void setSector(Sector sector) {
    this.sector = sector;
}

}

セクタ

/**
* The persistent class for the BCD_SECTOR database table.
* 
*/
@Entity
@Table(name="BCD_SECTOR")
public class Sector implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name="BCD_SECTOR_SECCODIGO_GENERATOR", sequenceName="BCD_SEC_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="BCD_SECTOR_SECCODIGO_GENERATOR")
@Column(name="SEC_CODIGO")
private Long secCodigo;

@Column(name="SEC_NOMBRE")
private String secNombre;

//bi-directional many-to-one association to Municipio
@OneToMany(mappedBy="sector")
private List<Municipio> municipios;

public Sector() {
}

public Long getSecCodigo() {
    return this.secCodigo;
}

public void setSecCodigo(Long secCodigo) {
    this.secCodigo = secCodigo;
}

public String getSecNombre() {
    return this.secNombre;
}

public void setSecNombre(String secNombre) {
    this.secNombre = secNombre;
}

public List<Municipio> getMunicipios() {
    return this.municipios;
}

public void setMunicipios(List<Municipio> municipios) {
    this.municipios = municipios;
}


}
4

3 に答える 3

2

TransientObjectExceptionは、適切な結合を保存せずにオブジェクトを保存しようとすると発生します。最初にセクターを保存する必要があり、その後、Municipioクラスを保存できます。

Municipio.setSector(new Sector());

これを使用することにより、特定のセクターMunicipioに割り当てます。しかし、セクターにはIDがありません。両方をどのようにマッピングしますか?そのため、例外が発生します。

詳細については、保存/更新コードを投稿してください。

それがあなたを助けることを願っています。

于 2012-12-20T05:34:56.210 に答える
1

この問題は、null オブジェクト自体には関連していませんが、OneToMany宣言に関する実際のエンティティの構造に関連しています。

私が間違っていなければ、事前に を保存せずににMunicipio関連付けられたを保存しようとしていますね。何が起こるかというと、Hibernate はとそれが所有する の間の関連付けられたマッピングを行う必要がありますが、後者がまだ永続化されていない場合、関連付けを作成するための参照はありません。SectorSectorMunicipioSector

Sector最初に保存してから保存してみてくださいMunicipio(必要に応じてカスケードを利用できます)。

于 2012-12-19T16:09:30.093 に答える
0

Municipio で、セクターを null として明示的に初期化してみてください。そして、はい、Sajan があなたの保存/変更コードを表示するように求めたように。

于 2012-12-20T02:02:01.880 に答える