2012-11-08 86 views
0

對於上下文,客戶端我使用MVP模式,因此帶有One列表的視圖只知道ID,並且當我在服務器上接收到新的Many時,我想要以便能夠更新One的外鍵,使用「setOneId」或ID爲空值的空One對象。DataNucleus中的多對一單向關係

因此,我嘗試在DataNucleus中創建一個多對一的單向,並且我正在努力一點。我可以使用JDO或JPA,我並不在乎。在JPA,我試過這個:

@Entity 
public class Many { 
    @Id 
    String id; 

    @ManyToOne 
    @Join(name = "idOne") 
    One one; 
} 

@Entity 
public class One { 
    @Id 
    String id; 
} 

這幾乎是我想要的。一對多創建但帶有連接表。我想有一個直接的關係。當我插入/更新Many時,我不想插入/更新相關的One,只需在我的Many對象中使用良好的ID更新idOne即可。

我發現這個blogpost,但它與Hibernate的,我認爲它仍然使用一個連接表:

@Entity 
public class Many { 
    @Id 
    public String id; 

    @Column(name="idOne") 
    private String idOne; 

    @ManyToOne 
    @JoinColumn(name="idOne", nullable=false, insertable=false, updatable=false) 
    private One one; 
} 

我試過,但我得到了確切this error

我不明白我是如何掙扎的。我的目標是創建一個表,保存一些參考數據(如國家列表One),以及創建/更新而不創建/更新的「工作項目」列表(如城鎮作爲類Many)參考數據,只是它的外鍵在Many對象中。

+0

使用'@ MoneyToMany'關係。 –

+0

你的意思是@ManyToMany? [文檔](http://www.datanucleus.org/products/datanucleus/jpa/orm/many_to_many.html)表示它是雙向的,它也使用連接表。在我的情況下,'One'對象不需要知道'Many'。 – Malexandre

+0

如果你把你寫的代碼,並刪除'@加入',那麼這將在JPA工作。代碼生成器會爲'Many'生成一個表,其中有一列是'One'的外鍵。我不認識'@ Join'註釋,所以我懷疑這是什麼導致了這個問題。 –

回答

1

如果它是一個單向關聯,並且Many是擁有方(根據第二個例子),那麼您的方向是錯誤的。在單向關係的所有方面委派更新和插入責任沒有多大意義(如insertable = false和updateable = false所做的那樣)。

編輯:更新回答 所以你想要的是多對一,擁有一個外鍵列。試試這個

@Entity 
public class Many { 
    @Id 
    String id; 

    @ManyToOne 
    @JoinColumn(name = "foreignKeyColumn") 
    One one; 
} 
+0

我試圖清楚,顯然我不是,太糟糕了。我不想要一個連接表,我想擁有一個擁有對象的外鍵。我不想在更新擁有的對象時更新擁有的對象,我只想更新外鍵。 – Malexandre

+0

你實際上在哪裏發帖,我只是沒有很好地閱讀。我的歉意,無論如何,我更新了我的答案:) – JustDanyul

+0

我們嘗試過,如果我沒有弄錯,問題是用DataNucleus,當保存'Many'時節省'One'。我們在OpenJPA中嘗試過,但它工作。我仍然希望能夠找到DataNucleus的解決方案,也許這是一個錯誤,並且一個問題必須在他們的跟蹤器上打開...... – Malexandre

1
@Entity 
public class A { 
    @Id 
    String id; 

    @OneToOne(cascade=CascadeType.ALL) 
    B b; 
} 

@Entity 
public class B { 
    @Id 
    String id; 
} 

,然後如果你堅持最初的對象爲

tx.begin(); 
A a = new A("FirstA"); 
B b1 = new B("FirstB"); 
B b2 = new B("SecondB"); 
a.setB(b1); 
em.persist(a); 
em.persist(b2); 
tx.commit(); 

... (some time later) 
tx.begin(); 
A a = em.find(A.class, "FirstA"); 
B b2 = em.getReference(B.class, "SecondB"); 

// update the B in A to the second one 
a.setB(b2); 
tx.commit(); 

這會更新A和B之間的FK無法獲得簡單