[英]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.