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

Odpovedet emailem