2010-07-24 22 views
8

Bazı varlıklar için jpa eşlemelerini ayarlamada sorun yaşıyorum. Aşağıdaki gibi tanımlanan bir ana varlığım var.jpa hazırda birleşik yabancı anahtar eşlemesi

@Entity 
@Table(name="EIF_INSTANCE_HDR") 
public class InstanceEntity implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(generator="eif_inst_gen") 
@SequenceGenerator(name="eif_inst_gen",sequenceName="EIF_INSTANCE_SEQ") 
@Column(name = "EAIH_ID") 
private Long eaihid; 
@Column(name = "EAD_ID") 
private Long eadid; 

@OneToMany(targetEntity=InstanceNotifyEntity.class, mappedBy="instance",fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>(); 
} 
aşağıdaki gibi sonra, bir kompozit anahtar w/çocuk varlık ve bu birincil anahtarın bir dış anahtar

:

@Entity 
@Table(name="EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@ManyToOne 
@JoinColumn(name="EAIH_ID", referencedColumnName="EAIH_ID") 
private InstanceEntity instance; 

@Id 
@Column(name="USER_ID") 
private Long userId; 
@Column(name="COMMENT_TXT") 
private String commentText; 
} 

I alt varlık yanlış biliyorum ama Bunu kompozit PK'ye sahip olacak şekilde nasıl ayarlayacağımı bilmiyorum. Bir PK sınıfını ayarlamam gerektiğini biliyorum, ancak bir alanın ana sınıfa yabancı anahtar olması durumunda bunu nasıl yapacağımı bilmiyorum. Ve bu bir kez kurulduktan sonra ebeveyn, çocuk varlığına nasıl başvurur?

Herhangi bir yardım için teşekkür ederiz.

+0

görün http://stackoverflow.com/questions/2562746/jpa-entity-design-problem/ 2563009 # 2563009 – axtavt

cevap

12

Bu, JPA 2 spec bölüm 2.4.1, "Türetilmiş Kimliklere İlişkili Ana Anahtarlar" tarafından yönetilmektedir. Bu bölüm, sorununuza doğrudan uygulanabilecek iki örnek içermektedir.

  • @IdClass
  • @EmbeddedId

İşte EmbeddedId şekilde kaba bir taslak verilmiştir: spec açıklandığı gibi

, bu durumda çocuk işletmenin anahtarını temsil etmek için iki yol vardır. EmbeddedId'u isteğe bağlı olarak seçtim, ancak IdClass ve EmbeddedId arasındaki seçim önemli. Farklı olarak seçebilirsiniz.

// Child entity's composite primary key 
@Embeddable 
public class InstanceNotifyEntityId implements Serializable { 
    Long eaihId; 
    Long userId; 
} 

// Child entity 
@Entity 
@Table(name="EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable { 
    @AttributeOverrides({ 
     @AttributeOverride(name="userId", column = @Column(name="USER_ID")) 
     @AttributeOverride(name="eaihId", column = @Column(name="EAIH_ID")) 
    }) 
    @EmbeddedId 
    InstanceNotifyEntityId id; 

    @MapsId("eaihId") 
    @ManyToOne 
    InstanceEntity instance; 

    // ... 
} 

ana varlık bir değişime ihtiyacı var: userDetails nitelik mappedBy "id.eaihId" olmalıdır. Bence bu kadar, ama daha önce hiç böyle varlık kullanmamıştım. Bir şey kaçırmış olabilirsiniz ... lütfen hataları görürseniz gönderin.

+0

Teşekkürler, bu çoğunlukla işe yarıyor. Maalesef jpa 2.0 kullanmıyorum, bu yüzden @MapsId ek açıklaması mevcut değil. Ana varlık userDetails nesnesinden çağlayan ilişkisini kaldırarak ekler için çalışıyorum. Bu yüzden, her alt öğeyi ana öğeye devam ettikten sonra eklemem gerekiyor, ancak şu an için kullanılabilir. – broschb

+0

@broschb Ne kullanıyorsunuz? –

+0

jpa 1.0 teknik özellikler. Şu anda jboss 4.2.3 kullanmam gerekiyor, benim anlayışım jpa 2.0 bu uygulama sunucusunda çalışmaz, en azından bir sürü kütüphaneyi değiştirmeden. – broschb

0

Aynı konuyla da karşı karşıyaydım ve bu cevabı takip ettim, ancak alt öğeyi ana varlık ile kaydetmiyor. İşte yaptığım değişiklikler ve iyi çalışıyor. değişiklikleri aşağıda Make -

// Child entity's composite primary key class 

public class InstanceNotifyEntityId implements Serializable { 

    @Column(name = "USER_ID") 
    Long userId; 

    @JoinColumn(name = "EAIH_ID") 
    @ManyToOne 
    InstanceEntity instance 
} 

// Child entity which contain composite primary key as a EmbeddedId, 
// no need to define any relationship here as we already define 
// the relationship in composite key class. 

@Entity 
@Table(name = "EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable { 

    @EmbeddedId 
    InstanceNotifyEntityId id; 
} 


// Parent entity (parent entity mappedby should be your composite 
// key class instance.child class object which already have the 
// join column mapping with "EAID_ID") 

@Entity 
@Table(name = "EIF_INSTANCE_HDR") 
public class InstanceEntity implements Serializable { 

    @OneToMany(mappedBy = "id.instance,fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>(); 
} 

ana varlık id.setInstance(parent entire obj) gibi kompozit anahtar içine ana nesne ayarlamak tasarruf ederken