Ja bych rekl, ze JPA nedovoluje @ManyToOne v kompozitnim klici, ale
Hibernate to umi, viz treba
http://opensource.atlassian.com/projects/hibernate/browse/ANN-16
http://opensource.atlassian.com/projects/hibernate/browse/ANN-15
tedy aspon jsem s tim kdysi experimentoval, ale nakonec jsem to nepouzil.

2011/1/14 Ondřej Fafejta <[email protected]>:
> Zdravím,
>
> pokud si pamatuju, tak se to řeší následovně:
>
> public class BundledMaterialPK implements Serializable {
>
>  @Column(name="material_id")
>   private Long materialId;
>
>   @Column(name="bundle_id")
>   private Long bundleId;
>
> tzn. ten primární klíč neobsahuje @Embeddable a neobsahuje odkazy na
> objekty @OneToOne, ale přímo Long ...
>
> entita BundledMaterial pak vypadá takto
>
> @Entity
> @IdClass(BundledMaterialPK.class)
> public class BundledMaterial implements Serializable {
>
> @Id
> private Long materialId;
>
> @Id
> private Long bundleId;
>
> // a hlavne
>
> @ManyToOne()
> @JoinColumn(name = "material_id", insertable = false, updatable = false)
> private Material material;
>
>
>
> Píšu to z hlavy, můžou tam být chyby.
> V každém případě je důležité, že se pro třídu PK používají primitivní
> typy (long, int)
> V hlavní entitě se pak přidá odkaz na druhou entitu pomocí @ManyToOne,
> kde musí být nastaveno insertable a updateable na false.
>
> Je možné použít i druhý způsob s Embeddable viz.
> http://stackoverflow.com/questions/3669883/hibernate-where-do-insertable-false-updatable-false-belong-in-composite-pri
>
> Fafi
>
>
> 2011/1/14 msk.conf <[email protected]>:
>>  Ahoj.
>>
>> Narazil som na podivny problem. Po uprave entit v existujucom projekte (
>> zmena modelu
>> vyziadala pouzivanie composite keys ) sa hibernate snazi ako value
>> kompozitneho kluca
>> serializovat objekt do blobu ( co asi neni to co chcem ).
>>
>> Entity vyzeraju nejak takto:
>>
>> @Entity
>> @Inheritance(strategy = InheritanceType.JOINED)
>> public class Material implements Serializable {
>>
>>    @Id
>>    @GeneratedValue ...
>>    private Long material_id;
>>  ...
>> }
>>
>> @Entity
>> public class BundledMaterial implements Serializable {
>>
>>    @EmbeddedId
>>    private BundledMaterialPK id;        // pouzivam zlozeny kluc
>> bundle:material
>>    private Long amount;
>>  ...
>> }
>>
>> @Embeddable
>> public class BundledMaterialPK implements Serializable {
>>
>>    @OneToOne(mappedBy = "material_id")
>>    private Material material;
>>
>>    @OneToOne(mappedBy = "bundle_id")
>>    private Bundle bundle;
>>  ...
>> }
>>
>>
>> @Entity
>> public class Bundle implements Serializable {
>>
>>    @Id
>>    @GeneratedValue ...
>>    private Long bundle_id;
>>
>>    @OneToMany(mappedBy="id.bundle", cascade=CascadeType.ALL)
>>    private List<BundledMaterial> bundledMaterial = new
>> ArrayList<BundledMaterial>();
>>  ...
>> }
>>
>>
>> V principe ide o to, ze mam nejaky zoznam materialu, zoznam bundlov, kazdy
>> bundle obsahuje
>> mnozinu materialu, kazdy v roznom mnozstve pre kazdy bundle.
>>
>> Schemu generuje hibernate, pricom logicky vygeneruje nasledovne tabule:
>>
>> material ( material_id PK, ... )
>> bundle ( bundle_id PK, ... )
>>
>> ale uplne nelogicky vygeneruje tabulku BundledMaterial:
>>
>> bundledmaterial (
>>  bundle blob (?),
>>  material blob (?),
>>  amount long,
>>  primary key ( bundle, amount )
>> )
>>
>> a snazi sa BundledMaterialPK.material a BundledMaterialPK.bundle do to tych
>> blobov hexaserializovat.
>>
>> Netusi niekto na co som zabudol, pripadne co som spravil zle?
>>
>> Diky
>>
>> --
>> Dusan
>>
>>
>>
>



-- 
Ondra Medek

Odpovedet emailem