2012-05-23 103 views
4

創建外鍵複合主鍵這是一個情況下,我想在我的播放項目表示:無法在播放2.0

table clients { 
    client_id (pk), 
    description 
} 

table items { 
    client_id (fk, pk), 
    item_id (pk) 
} 

在「項目」表我想有一個複合主鍵這將包含組合的client_id和item_id。我已閱讀JPA文檔以及該主題上的許多帖子,但所有內容都一次又一次地失敗。這是我嘗試過的許多版本之一 - 最接近JPA文檔。在COM錯誤讀取註解 models.ItemsPK :

@Entity 
@Table(name = "items") 
public class Items extends Model { 
    ItemsPK primaryKey; 

    public Items() { 
    } 

    @EmbeddedId 
    public ItemsPK getPrimaryKey() { 
     return primaryKey; 
    } 

    public void setPrimaryKey(ItemsPK pk) { 
     primaryKey = pk; 
    } 
} 

@Embeddable 
public class ItemsPK implements Serializable { 
    private long itemId; 
    private Client client; 

    public ItemsPK() { 
    } 

    @Column(name = "item_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long getItemId() { 
     return itemId; 
    } 

    public void setItemId(long itemId) { 
     this.itemId = itemId; 
    } 

    @ManyToOne 
    @JoinColumn(name = "client_id", nullable = false) 
    public Client getClient() { 
     return client; 
    } 

    public void setClient(Client client) { 
     this.client = client; 
    } 

    //public int hashCode() {... 
    //public boolean equals(Object obj) {... 
} 

上面的代碼(以及其他許多不同的設置)遊戲推出時會產生以下錯誤:

了java.lang.RuntimeException。 avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:73) 〜[ebean.jar:na] at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1100 ) 〜[ebean.jar:na]

我不知道我的代碼可能有什麼問題。我開始認爲這是一個PLAY錯誤。有任何想法嗎?

+0

你有一個堅實的理由堅持複合PK?即使您設法處理這個問題,您也可能因此面臨其他幾個問題。爲什麼不在item表中添加一個額外的列(比如items_id),並在(client_id,item_id)上添加一個唯一索引。 (我想item_id是指物品表,就像client_id引用客戶表一樣)。 – bpgergo

+0

@bpgergo謝謝你的回答。你的解決方案是可以接受的,但我寧願避免額外的列和索引。令我驚訝的是,這樣一個簡單的案例需要解決。如果幾天內沒有解決方案,我會重新考慮。至於item_id,目前它並沒有引用任何其他表,但將來可能會改變。 – Grzywa

+1

標籤:hibernate **在這裏不正確。沒有Hibernate也沒有JPA – ses

回答

0

Cześć,

這不是一個答案,而是建議。你能告訴我在你的情況下使用複合PK的主要目標是什麼?你的這兩款車型將是reaaaaly體積小,易於與Ebean ORM

型號/ Client.java

package models; 

import play.db.ebean.Model; 
import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class Client extends Model { 
    @Id 
    public Long id; 
    public String description; 
} 

型號/ Item.java

package models; 

import play.db.ebean.Model; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 

@Entity 
public class Item extends Model { 
    @Id 
    public Long id; 

    @ManyToOne 
    public Client client; 
} 

,這一切。它給你你需要的除了複合PK

+0

在這個系統中,每個item_id應該只在一個client_id內唯一。換句話說,兩個不同的客戶可以擁有相同ID的項目,但是一個客戶不能有兩個相同的item_id。 Item_id是用戶定義的值。每個用戶都可以擁有自己的一套物品。在這方面你的回答並不能解決我的問題。 – Grzywa

+0

Yhm,只是普通的@ManyToMany關係,當然Ebean會爲這個+創建'ItemClient'表,您必須確保在保存新關係之前關係不存在,但我仍然認爲這是更簡單和更便宜的解決方案。恕我直言 – biesior

0

根據我的經驗,您無法在EmbeddedId中使用GeneratedValue,因此必須分配組合鍵中的值。請參閱下面的摘錄。

對於簡單主鍵,只需要支持使用GeneratedValue註釋 。衍生主鍵不支持GeneratedValue 註釋的使用。

http://docs.oracle.com/javaee/6/api/javax/persistence/GeneratedValue.html

http://www.objectdb.com/api/java/jpa/GeneratedValue

我建議不使用複合密鑰對這個作爲itemId將是產生唯一的標識符就足夠了。

0

我認爲你還沒有禁用Ebean。 Ebean是Play 2的默認ORM。如果您想使用JPA,則必須禁用Ebean。

所以在你的構建。斯卡拉,補充一點:

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    ebeanEnabled := false 
) 

而在你application.conf編輯這一行:

ebean.default="models.*" 
+2

你可以使用ebean和JPA批註,所以沒有理由禁用ebean。 – stian