2016-04-11 13 views
0

Hazırda bekletme, bir ilişkilendirmenin nesnesi bir bileşik anahtar olduğunda bir FK başvurusunu güncelleştiriyor gibi görünmüyor.Hedef bileşik anahtar olduğunda ManyToOne'u kaydetme Hazırda bekletme

İşlem başarılı (hata yok, yığın izi yok) ancak güncelleme bildirimi oluşturulmadı (hazırda bekletme günlüğüne sahip durumdayım).

Semptomlarda herhangi bir değişiklik yapmadan, kaskatı ek açıklamaların (kaskat, ALL, PERSIST, hatta SAVE_UPDATE) her tür yolunu denedim. Güncelleme belirtisi, hem on-line OpenXava ekranından hem de özel Java kodundan (OpenXava eyleminde) mevcuttur.

Uygulama veritabanının tablolara harici yüklemelere izin verme gereksinimleri vardır, bu yüzden sistem tarafından atanan anahtarlara geçmenin sürdürmek istedikleri bir seçenek olmadığı söylendi.

(şu anda herhangi bir kaskad ayarı olmadan) sahip olma dernek:

@ManyToOne(fetch=FetchType.LAZY,optional=false) 
    @Required 
    @JoinColumns({ 
    @JoinColumn(name="programID",referencedColumnName="programID",nullable=false,unique=false,insertable=false,updatable=false), 
    @JoinColumn(name="projectID",referencedColumnName="projectID",nullable=false,unique=false,insertable=false,updatable=false) 
    }) 
    @DescriptionsList(descriptionProperties="parentProgram.programName,projectName") 
    @ReferenceView("reference") 
    private Project associatedProject; 

ters ilişki:

@OneToMany(mappedBy="associatedProject",fetch=FetchType.LAZY) //No cascade allowed 
    @ReadOnly 
    private Set<Asset> assets = new HashSet<Asset>(); 
açık hazırda hata bu konuda varsa

bilen var mı? Google aramasını kullanarak hiçbir şey bulamadım, ancak belki de birisinin ilk elden deneyimi var.

Sağol, Roy.

DÜZENLEME: Bir çalışma çevresinde kendi HQL güncellememi yazmaya çalıştım. SET madde işlerken bir geniş hazırda yazım hatası unexpected AST node: AND başarısız

update Asset set associatedProject = :ap where assetKey = :key 

. Sonra update Asset cross join set projectID=?, programID=? where assetKey=? oluşturulur ve

update Asset set associatedProject.projectId = :projId, associatedProject.parentProgram = :pgm where assetKey = :key 

kendi SQL güncelleme işler yapmaya

Ancak "çapraz" nde geçersiz sözdizimi başarısız oldu.

Herkes daha iyi bir çalışma ortamı var mı? Ya da kök sorunuyla ilgili başka düşünceleriniz var mı? Bence

, bu hala bir hazırda hata işaret (tabii ki bir hata - sadece herhangi bir hata veya mesajlar olmadan bir güncelleme atlamak olamaz) bileşik anahtar işleme ile.

+0

Yaptığınız işe yakından bakmadım, ancak uykuda bir hata olduğundan şüpheleniyorum (hazırda bekletme yolu olgun). –

+0

@Robert benim deneyimime göre, çok fazla değil.Kompozit anahtar desteğinin birçoğu en iyi şekilde belgelenmemiş ve tam olarak reklamı yapılan şekilde çalışmaz (çoğu sorun için şimdiye kadar iş çevreleri var gibi görünmektedir). –

+0

@Brian 'programID/projectID ', Proje öğesinin bileşik anahtarıdır. 'ProgramID', Program varlığı için tek anahtardır. Bir Programın birçok projesi vardır. Bir Varlık (kote kodumun içeriği) belirli bir Proje ile ilişkilendirilir (Varlık tablosunda 2 sütunluk FK olarak uygulanır), ancak bir Proje'den diğerine aktarılabilir. Bu belirtinin sebebidir - ilişkilendirmeyi bir Proje'den diğerine değiştirirken, Hazırda Beklet, "relatedProject" değerinin değiştirilmesini sürdürmez. –

cevap

0

Hazırda bekletme, ilişkiyi kaydetmez, çünkü bunu kaydetmediğinizi söylersiniz. Sadece iki @JoinColumn gelen insertable = false, updatable = false kaldırın.

+0

Bu işe yaramaz çünkü yinelenen bir sütun hakkında şikayet eden bir Hazırda Bekletme eşleme istisnası oluşturuyor (bkz. Brian'a yaptığım yorum). Ayrıca, Hazırda Beklet, aynı eşlemede doğru ve yanlışların karıştırılmasına ve eşleşmesine izin vermez (uygun kompozit anahtar FK referans desteği için gerekli olan). –

+0

JPA, bir ilişkiyi ve aynı sütuna karşı bir sütun eşleştirilemez = false, updatable = true. İlişkinin belirleyicisinden sade özellikleri değiştirmek zorundasınız. OpenXavaTest projesinin Carrier.java'sına bakın – javierpaniza

0

Burada, birincil anahtarlarınızı eşlemek için "türetilmiş kimlik" özelliğini nasıl kullanabileceğinize dair bir başlangıç ​​var ve bu yardımcı olabilir. Sadece modelinde tahmin ediyorum. Ama

@Entity 
public class Program { 
    @Id 
    int id; 

    @OneToMany(mappedBy="program") 
    Set<Project> projects; 

    ... 
} 

@Embeddable 
public class ProjectID { 
    int projectID; 
    int programID; // corresponds to the type of Program's primary key 

    ... 
} 

@Entity 
public class Project { 
    @EmbeddedId 
    ProjectID id; 

    @MapsId("programID") // maps 'programID' attribute of embedded ID 
    @ManyToOne 
    Program program; 

    @OneToMany(mappedBy="associatedProject", fetch=FetchType.LAZY) 
    Set<Asset> assets; 

    ... 
} 

@Embeddable 
public class AssetID { 
    int assetID; 
    ProjectID projectID; // corresponds to the type of Project's primary key 

    ... 
} 

@Entity 
public class Asset { 
    @EmbeddedId 
    AssetID id; 

    @MapsId("projectID") // maps 'projectID' attribute of embedded ID 
    @ManyToOne(fetch=FetchType.LAZY, optional=false) 
    Project associatedProject; 

    ... 
} 

Türetilmiş kimlikler JPA 2.1 spec tartışılmaktadır .... bir başlangıç, bölüm 2.4.1.

+0

Tamam, @EmbeddedId yolunu birkez daha aşağıya indirdim, ama yine de bu tartışma için tekrar yapalım. Model ile ilgili bazı açıklamalar - Program ve Proje oldukça iyidir. Bununla birlikte, Wave isimli bir üçüncü seviye, Proje'nin 0: M doğrudan torunu, bileşik anahtar programID, projectID, WaveID'dir. Tecrübemde, Hibernate'in üçüncü seviyedeki bileşik kilit sınırlamalarını göstermeye başladığı yer burası. Daha sonra, Varet (sadece varlık ID'si) zorunlu bir Proje için FK'ye ve isteğe bağlı bir FK'den Dalga'ya kadar. –

İlgili konular