Dobrý den,
řeším mapování mezi 2 tabulkami, popíšu situaci minimalisticky:
foo(id, ...)
hoo(foo_id, x, ...)
Klíčem tabulky foo je id.
Klíčem tabulky hoo je dvojice (foo_id,x), kde foo_id je reference na foo.id.
Sloupec x může nabývat pouze hodnot 'A','B','N'.
Pro dané foo.id tedy mohou existovat min. 0 a max. 3 řádky v hoo.
Chci ve třídě Foo mít 3 reference na Hoo, každou pro různou hodnotu x.
Říkám si, že vztah Foo-Hoo je sice one-to-many, ale při zafixování hodnoty x už
to je one-to-one. Možných hodnot x z principu nemůže být víc.
Je mi jasné, že by šlo deklarovat one-to-many Set<Hoo> a příslušnou instanci
vybrat programově, ale nevidím moc benefit realizovat aplikačně něco, co lze
vyjádřit už v SQL jednoduchým joinem
foo left join hoo on foo.id = hoo.foo_id and hoo.x='A'
Po nějaké době jsem rozchodil následující řešení pomocí
@JoinColumnsAndFormulas. Přijde mi, že jednotlivé @JoinColumnsOrFormula
napasuje na sloupce kompozitního klíče, ale neznám Hibernate do takové hloubky.
Výskytů na googlu taky moc není. Máte prosím s těmito anotacemi někdo
zkušenost, případně řeší se tento problém zcela jinak?
(Pro úplnost: featury specifické pro Hibernate nevadí, databáze je "legacy" a
její návrh se jen tak nezmění. Databáze je Oracle.)
Díky!
Tomáš Záluský
// gettery a settery vynechány
@Entity
@Table(name="foo")
public class Foo {
@Id
@Column(name="id")
private BigDecimal id;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name="id",insertable=false,updatable=false)),
@JoinColumnOrFormula(formula=@JoinFormula(value="'N'")),
})
private Hoo hooN;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name="id",insertable=false,updatable=false)),
@JoinColumnOrFormula(formula=@JoinFormula(value="'A'")),
})
private Hoo hooA;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name="id",insertable=false,updatable=false)),
@JoinColumnOrFormula(formula=@JoinFormula(value="'B'")),
})
private Hoo hooB;
}
@Entity
@Table(name="hoo")
public class Hoo {
@Embeddable
public static class HooId implements Serializable {
@Column(name="foo_id")
private BigDecimal fooId;
@Column(name="x")
private String x;
// TODO equals a hashcode
}
@EmbeddedId
private HooId id;
}
================================================
...with Ultimate flying is so easy...
http://www.frisbee.cz http://www.peaceegg.net
================================================