簡體   English   中英

休眠一對一映射問題

[英]Hibernate one-to-one mapping problem

您好,我上了以下課程:

public class Movimenti implements java.io.Serializable {

private Integer id = null;
private Integer idCommessa = null;
private String nomemovimento = null;
private Movimento preventivato = null;
private Movimento effettivo = null;

public Movimento getEffettivo() {
    return effettivo;
}

public void setEffettivo(Movimento effettivo) {
    this.effettivo = effettivo;
}

public Movimento getPreventivato() {
    return preventivato;
}

public void setPreventivato(Movimento preventivato) {
    this.preventivato = preventivato;
}

public Movimenti() {
}

public Movimenti(Integer idCommessa, String nomemovimento) {
    this.idCommessa = idCommessa;
    this.nomemovimento = nomemovimento;
}

public Integer getId() {
    return this.id;
}

public void setId(Integer id) {
    this.id = id;
}

public Integer getIdCommessa() {
    return this.idCommessa;
}

public void setIdCommessa(Integer idCommessa) {
    this.idCommessa = idCommessa;
}

public String getNomemovimento() {
    return this.nomemovimento;
}

public void setNomemovimento(String nomemovimento) {
    this.nomemovimento = nomemovimento;
}

}

如您所見,有兩個Movimento參考。 Movimento看起來像這樣:

public class Movimento {

    Integer id = null;
    Movimenti movimenti;
    String descrizione = null;

    public Movimenti getMovimenti() {
        return movimenti;
    }

    public void setMovimenti(Movimenti movimenti) {
        this.movimenti = movimenti;
    }

    public String getDescrizione() {
        return descrizione;
    }

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

在movimento中有對Movimenti的引用。 現在,movimento是其他類的基類,並且由於SchemaExport正確完成其工作,因此不會出現任何問題。 我想要的是在Movimento和Movimenti之間建立一對一的關系,這樣,當我加載Movimenti實例時,我可以自動重導Movimento,反之亦然,並且可以自動刪除孤立的Movimento對象。 因此,我想到了在Movimenti中將兩個一對一的關系放到Movimento上,然后再倒向一個。 但是它不起作用,它不會生成正確的數據庫表,甚至會發出異常。 這些是映射(甚至還有我不包含的子類)。

Movimento.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class dynamic-insert="false" dynamic-update="false" mutable="true" name="persistence.beans.jCommesse.Movimento" optimistic-lock="version" polymorphism="implicit" select-before-update="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name = "descrizione" type="java.lang.String">
            <column name = "descrizione"></column>
        </property>
        <one-to-one name = "movimenti"  class = "persistence.beans.jCommesse.Movimento" constrained="true">

        </one-to-one>
        <joined-subclass name = "persistence.beans.jCommesse.Materiali" table = "Materiali">
            <key column="id"/>
            <property name = "consegnato" type="java.lang.Boolean">
                <column name = "consegnato"/>
            </property>
            <property name="costo" type = "java.lang.Double">
                <column name = "costo"/>
            </property>
            <property name = "costoTrasporto" type = "java.lang.Double">
                <column name = "costoTrasporto"/>
            </property>
            <property name = "quantita" type = "java.lang.Double">
                <column name = "quantita"/>
            </property>
            <property name = "riferimentoFattura" type = "java.lang.Integer">
                <column name = "riferimentoFattura"/>
            </property>
            <property name = "tipoQuantita" type = "java.lang.String">
                <column name = "tipoQuantita"/>
            </property>
        </joined-subclass>

        <joined-subclass name = "persistence.beans.jCommesse.RientroMateriali" table = "RientroMateriali">
            <key column="id"/>
            <property name = "costo" type = "java.lang.Double">
                <column name = "costo"/>
            </property>
            <property name = "costoDelTrasporto" type = "java.lang.Double">
                <column name = "costoDelTrasporto"/>
            </property>
            <property name = "quantita" type = "java.lang.Double">
                <column name = "quantita"/>
            </property>
            <property name = "riferimentoFattura" type = "java.lang.Integer">
                <column name = "riferimentoFattura"/>
            </property>
            <property name = "tipoQuantita" type = "java.lang.String">
                <column name = "tipoQuantita"/>
            </property>
        </joined-subclass>

        <joined-subclass name = "persistence.beans.jCommesse.CostiExtra" table = "CostiExtra">
            <key column = "id"/>
            <property name = "nota" type = "java.lang.String">
                <column name = "nota"/>
            </property>
            <property name = "prezzo" type = "java.lang.Double">
                <column name = "prezzo"/>
            </property>
        </joined-subclass>
    </class>
</hibernate-mapping>

和Movimenti.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 10-feb-2010 11.24.48 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="persistence.beans.jCommesse.Movimenti" table="movimenti" catalog="jcommesse">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="idCommessa" type="java.lang.Integer">
            <column name="idCommessa" />
        </property>
        <property name="nomemovimento" type="string">
            <column name="nomemovimento" length="250" />
        </property>


        <one-to-one name="preventivato" class="persistence.beans.jCommesse.Movimento" cascade="all" />



    </class>
</hibernate-mapping>

所有這些都不會創建表,而是會出現以下討厭的異常:

    10-feb-2010 15.04.46 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: schema update complete
Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: persistence.beans.jCommesse.Materiali.movimenti
        at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
        at testgeneration.testSchema(testgeneration.java:34)
        at testgeneration.main(testgeneration.java:53)
Java Result: 1

如您所見,它說“模式生成已完成”(我正在使用更新進行開發)。

Movimenti和Movimento在mySQL上像這樣出來:

CREATE TABLE `movimenti` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idCommessa` int(11) DEFAULT NULL,
  `nomemovimento` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `movimento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `descrizione` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKBEB397FC4778E205` (`id`),
  CONSTRAINT `FKBEB397FC4778E205` FOREIGN KEY (`id`) REFERENCES `movimento` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1

我發現了幾個問題:

  1. 例外是由於在使用Materiali類時出現的錯誤(它也具有字段movimenti ,該字段必須為非null,但與您的問題無關,並且對此感到困惑)。

  2. 在映射Movimenti.hbm.xml ,您忘記映射了兩個字段preventivatoeffettivo 您必須使用reverse=true映射它們。

  3. 我真的建議對地圖使用注解。 它們更易於使用,並將所有信息保存在一個地方。

  4. 在兩個表中看不到任何引用的原因是因為Hibernate創建了多對多映射(需要第三個表)。 我了解您要達到的目標,但是我不確定Hibernate是否足夠聰明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM