繁体   English   中英

在PLAY 2.0中无法使用外键创建复合主键

[英]Can't create composite primary key with foreign key in PLAY 2.0

这是我想在我的PLAY项目中表示的情况:

table clients {
     client_id (pk),
     description
}

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

在'items'表中,我希望有一个复合主键,它将由组合的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的com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations.readAssociations(ReadAnnotations.java:73)〜[ebean.jar:na]中读取models.ItemsPK的注释时出错.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1100)〜[ebean.jar:na]

我不知道我的代码可能有什么问题。 我开始认为这是一个播放错误。 有任何想法吗?

根据我的经验,您无法在EmbeddedId中使用GeneratedValue,必须分配复合键中的值。 见下面的摘录。

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

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

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

我建议不要使用复合键,因为itemId足以生成唯一标识符。

Cześć,

这不是答案,而是建议。 你能告诉我在你的情况下使用复合PK的主要目标是什么? 使用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之外,它还能满足您的需求

我认为你还没有禁用Ebean。 Ebean是Play 2的默认ORM。如果要使用JPA,则必须禁用Ebean。

所以在你的Build.scala中,添加:

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

在你的application.conf中编辑这一行:

ebean.default="models.*"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM