Dobry den,

prichazim asi s krizkem po funuse, protoze jste to uz vyresili, nicmene si dovolim par poznamek:

1) entita muze byt potomkem jine entity:
@Entity
@Table(name = "ZAKAZKY")
public class Zakazka implements Serializable {
   @Id
   @Column(name = "ZAKAZKA")
   private Integer zakazka;
   @Column(name = "NAZEV")
   private String nazev;
   ...
}

@Entity
public class ZakazkaRozsirena extends Zakazka implements Serializable {
   @Column(name = "MAX_CENA")
   private Double maxCena;
   ...
}

Entita ZakazkaRozsirena pak obsahuje hodnoty zakazka, nazev a maxCena. Vas problem byl patrne v tom, ze maxCena se melo vybirat z jine tabulky.

2) MappedSuperclass se pouziva, kdyz entita dedi od trida, ktera neni entitou (tj. neni oznacena anotaci @Entity). To vsak neni Vas pripad. Anotaci MappedSuperclass rikate, ze chcete atributy z teto tridy zahrnout do entity (ktera bude potomkem) a mapovat je do database. Pouziti MappedSuperclass a Entity soucasne nedava smysl (Netbeans na to spravne upozornuji).

Z.T.
--
Zdenek Tronicek
Department of Computer Science and Engineering
Prague                   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Quoting Lukas Barton <[EMAIL PROTECTED]>:

Ahoj,

jeste dodatek.

To nize uvede mapovani neni mapovani dedicnosti.
A taky anotace pro  mapovani se nededi. Takze by to stejne nemohlo fungovat.

Tak jak to tam mate uvedene, tak mapujete dve Entity:

* Jedna ma sloupce NAZEV a ZAKAZKA.
Druha ma sloupce MAX_CENA.
*
Jak spravne mapovat dedicnost je tady:
http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e788

*Ale vy jste asi chtel mapovat dve ruzne entity na jednu tabulku.
*To potom musite udelat jinak, pomoci anotaci:

/@Table  a parametru name anotace Entity.
U kazde tridy uvest vsechny mapovane property (proste tam overridujete
metody a pridate k nim anotace  nebo jednoduseji to mapovani napisete v
XML).
A zavolate SQLQuery#addEntity(String entityName);.
/
Nebo muzete pouzit postup popsany v
http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e898


  Lukas


Karel Nagy wrote:
Peclive jsem vse zkontroloval a opravdu mam namapovane vsechny sloupecky.
Mapovani sloupecku provadim pomoci anotaci v entite.
Konfigurace Hibernate projde. Pokud zakomentuji radek <mapping class="entity.ZakazkaRozsirena"/>, tak vse funguje, pokud tam neni zakomentovany, tak program spadne (Column name DTYPE not found in result set) i kdyz entity ZakazkaRozsirena vubec v kodu nepouziju.
Takto vypada konfigurace Hibernate

<hibernate-configuration>
  <session-factory>
      <property name="hibernate.connection.driver_class">
          org.firebirdsql.jdbc.FBDriver
      </property>
      <property name="hibernate.connection.url">
          jdbc:firebirdsql://cesta k db
      </property>
      <property name="hibernate.connection.username">
          uzivatel
      </property>
      <property name="hibernate.connection.password">
          heslo
      </property>
<property name="hibernate.dialect">org.hibernate.dialect.FirebirdDialect</property>
           <!-- List of XML mapping files -->
      <mapping class="entity.Zakazka"/>
      <mapping class="entity.ZakazkaRozsirena"/>
  </session-factory>
</hibernate-configuration>



Tabulka ZAKAZKY
  ZAKAZKA   integer
  NAZEV varchar(20)
select * from ZAKAZKY

@Entity
@Table(name = "ZAKAZKY")
public class Zakazka implements Serializable {
  @Id
  @Column(name = "ZAKAZKA")
  private Integer zakazka;
  @Column(name = "NAZEV")
  private String nazev;

  public Zakazka () {
  }

  public Zakazka (Integer zakazka) {
      this.zakazka = zakazka;
  }

  public Integer getZakazka () {
      return zakazka;
  }

  public void setZakazka (Integer zakazka) {
      this.zakazka = zakazka;
  }

  public String getZakazka () {
      return zakazka;
  }

  public void setNazev (String nazev) {
      this.nazev = nazev;
  }

  @Override
  public int hashCode () {
      int hash = 0;
      hash += (pkid != null ? pkid.hashCode () : 0);
      return hash;
  }

  @Override
  public boolean equals (Object object) {
      if (!(object instanceof Zakazka)) {
          return false;
      }
      Zakazka other = (Zakazka) object;
if ((this.pkid == null && other.pkid != null) || (this.pkid != null && !this.pkid.equals (other.pkid))) {
          return false;
      }
      return true;
  }

  @Override
  public String toString () {
      return "entity.Zakazka[pkid="+ pkid + "]";
  }
}



select ZAKAZKY.*, (select max(OCENENI.CENA) from OCENENI where OCENENI.ZAKAZKA = ZAKAZKY.ZAKAZKA) as MAX_CENA
from ZAK_ZAKAZKY

@Entity
public class ZakazkaRozsirena extends Zakazka implements Serializable {
  @Column(name = "MAX_CENA")
  private Double maxCena;

  public MyTableExt () {
  }

  public Double getMaxCena () {
      return maxCena;
  }

  public void setMaxCena (Double maxCena) {
      this.maxCena = maxCena;
  }
}


Jiri Mares napsal(a):
Dobry den,

protoze jste neuvedl jake mate mapovaci soubory pak velmi spatne muzeme odhadnout kde je problem, ale rozhodne nebude v kodu Hibernate, protoze pokud byste mel mapovani spravne, pak hibernate umi dotaz takovy jaky je, dokonce natahne jak zakazky tak rozsirene zakazky a vsechny se vsema sloupeckama. Dokonce se necha napsat dotaz "select * from Object" a
ziskate vsechny persistentni objekty z db.

Diskriminator se pouziva v okamziku, kdy mapujete vice trid do jedne tabulky, aby Hibernate dokazalo nejak odlisit tyto ruzne instance od sebe. Diskriminator definujete vy v mapovani a pro kazdou mapovanou tridu mu priradite hodnotu.

Takze ja bych rekl, ze v mapovani ten sloupecek mate, ale nemate jej v db definovan.

Co vy na to?

Jirka






Odpovedet emailem