这是我想在我的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:读取注释时出错 models.ItemsPK at com.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]
我不知道我的代码可能有什么问题。我开始认为这是一个播放错误。有什么想法吗?
答案 0 :(得分: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
足以生成唯一标识符。
答案 1 :(得分:0)
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
之外,它还能满足您的需求答案 2 :(得分:0)
我认为你没有禁用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.*"