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