无法创建与PLAY 2.0外键复合主键(Can't create composite pri

2019-09-17 11:02发布

这是一个情况下,我想在我的播放项目来表示:

table clients {
     client_id (pk),
     description
}

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

在“项目”表我想有一个复合主键,将组成联合CLIENT_ID和ITEM_ID的。 我已阅读JPA文档以及很多职位上的话题,但一切都一次又一次地失败。 这是很多版本我都试过之一 - 最接近JPA文档。

@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:在com.avaje.ebeaninternal:错误读数models.ItemsPK注释在com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:73)〜[NA ebean.jar] .server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1100)〜[ebean.jar:NA]

我没有什么线索可能是错我的代码。 我开始认为这是一个错误PLAY。 有任何想法吗?

Answer 1:

你好,

这不是一个答案,而是建议。 你能告诉我什么是你的情况采用复合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什么



Answer 2:

根据我的经验,你是不是能够使用GeneratedValue的EmbeddedId内,复合键的值必须分配。 见下面摘录。

仅需要使用GeneratedValue注释的简单主键得到支持。 在GeneratedValue注释的使用不支持派生的主键。

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

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

我建议不使用此复合键itemId将是产生唯一的标识符就足够了。



Answer 3:

我认为你没有禁用Ebean。 Ebean是播放2.如果你想使用JPA必须禁用Ebean默认ORM。

因此,在您Build.scala,补充一点:

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

而在你application.conf编辑这行:

ebean.default="models.*"


文章来源: Can't create composite primary key with foreign key in PLAY 2.0