Pro úplnost ke svému měsíc starému příspěvku dodávám, že řešení funguje uspokojivě. Pouze se vyskytl problém, pokud pro některé x neexistuje řádek v podřízené tabulce - vyhazovalo to výjimku, chtěli jsme však, aby to vracelo null. Vyřešeno pomocí @NotFound(action=NotFoundAction.IGNORE) (defaultní hodnota anotace je EXCEPTION - odtud ta výjimka) Kdyby se to někomu hodilo. TZ
______________________________________________________________ > Od: "Tomáš Záluský" <[email protected]> > Komu: <[email protected]> > Datum: 10.02.2011 23:09 > Předmět: Hibernate - one-to-one mapování na entitu s kompozitním klíčem > > >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 >================================================ >
