2015-08-06 21 views
11

3 tabloya karşılık gelen 3 sınıfım var V, D ve P. D, FK'ye V (FK_V) sahip ve OneToMany ilişkisini kullanarak katılmaktadır. Ayrıca bunların çıkışları, bu V, D ve P arasındaki ilişkiye sahip olan bir 4. tablo V_D_P'dan çıkar.Hazırda iki kez aynı nesneyi sürdürmeye çalışırken hazırda bekletme

@Entity 
@Table(name = "V")             
public class V { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "ID") 
    private Long id; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name = "FK_V", referencedColumnName="Id", nullable = false) 
    private Set<D> d; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name = "FK_V", referencedColumnName="Id", nullable = false) 
    private Set<V_D_P> vdp; 

    //Getters Setters etc. 
} 


@Entity 
@Table(name = "V_D_P") 
public class V_D_P { 

     @Id 
     @GeneratedValue(strategy = GenerationType.SEQUENCE) 
     @Column(name = "ID") 
     private Long id; 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name = "FK_D", nullable = false) 
    private D d; 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name = "FK_P", nullable = false) 
    private P p; 

    //Getters Setters etc.  
} 

@Entity 
@Table(name = "D")             
public class D { 
     @Id 
     @GeneratedValue(strategy = GenerationType.SEQUENCE) 
     @Column(name = "ID") 
     private Long id; 

    //Getters Setters etc. 
} 

@Entity 
@Table(name = "P")             
public class P { 

     @Id 
     @GeneratedValue(strategy = GenerationType.SEQUENCE) 
     @Column(name = "ID") 
     private Long id; 

    //Getters Setters etc. 
} 

Sevgilerine ilişkisi ile birlikte V, D ve P devam etmek istiyorum: Aşağıdaki

gibi bu görünüm için veri modeli budur. Ben şimdi ben iki kez aynı d nesneyi ekliyorum görebilirsiniz

V v = new V(); 

D d = new D(); 
Set<D> dSet = new HashSet<>(); 
dSet.add(d); 
v.setD(dSet); // Adding d to V ....(1) 

P p = new P(); 
V_D_P vdp = new V_D_P(); 

vdp.setD(d); // Adding d to V_D_P ....(2) 
vdp.setP(p); 

Set<V_D_P> vdpSet = new HashSet<V_D_P>(); 
vdpSet.add(vdp); 
v.setVdp(vdpSet); 

entityManager.persist(v); 

duyuyorum. Bir kez P'ye ve bir kez V_D_P'ye. Ancak bunlar aynı nesneler olduğu için, sadece bir kez kalmalıdır. Ancak hazırda bekletme günlüklerine dayanarak hazırda beklemenin 2 farklı nesne eklemeye çalıştığını görüyorum. ORA-00001: benzersiz kısıtlama

bu aynı nesneler olduğunu hazırda bekletme ve yalnızca bir kez Persis izin için bir yol var mı

şunlarla duruma bakın?

+1

Sorununuzu yeniden oluşturamadım; 'D' için yalnızca bir tane ekleme ifadesi oluşturulur. Tüm ek açıklamalar javax.persistence. * 'Paketinden mi? –

+1

@DraganBozanovic: Evet. Her iki ek açıklama da javax.persistence. * Paketindedir. Aynı objeyi (dSet.add (d); & vdp.setD (d);) gibi iki kez eklediğinize ve sonra ikisini de sürdürmeye çalıştığınıza emin misiniz? –

+1

Evet, gönderdiğiniz kodu kopyalayıp yapıştırdım. [Burada] (http://pastie.org/10341717) Hazırda Bekletilen SQL'dir; H2 veritabanı ('org.hibernate.dialect.H2Dialect') ile denedim. Hangi lehçeyi kullanıyorsunuz ve davada Hibernate tarafından oluşturulan SQL'i gönderebilirsiniz? –

cevap

4

Nesneler kimlik tarafından benzersiz şekilde tanımlanır. Bu nedenle aynı kimliğe sahip olmaları gerekiyor.

  • Ya önce kimliği sağlamak,
  • veya bir defa devam ederse ve (böylece id kümesi vardır) diğer kaydetmeden önce d nesneyi yenileyin.
1

persist() yerine save()'u deneyin. this post'da belirtildiği gibi, kalıcı olarak nesnenin kimliğini derhal güncellemez. Bu, hazırda bekletme nesnesinin nesne grafiğini geçtiği sırada iki kere 'd' nesneyinizle karşılaşabileceği anlamına gelir. Her iki seferde "id, null, yeni bir tane eklemem gerek" diyebilir.

Görünüşe göre bu davranış iyi tanımlanmadı, bu nedenle her durumda olmayabilir.

1

VDP.d alanına gerçekten ihtiyacınız var mı: V ve V (D) P (V (D) P alanı av alanı olacaktır) arasında iki yönlü (haritalanmış) bir ilişki kullanamazsınız ve sadece gezin V (D) Pvd?

İlgili konular