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