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
>================================================
>

Odpovedet emailem