【发布时间】:2011-10-25 21:13:32
【问题描述】:
我有一个嵌入式模型方案。有代理,代理有代理所在的城市。
模型看起来如下:
城市:
package models;
import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
import play.data.validation.*;
@Entity
public class City extends Model {
@Required
@Column(unique=true)
public String name;
@ElementCollection
@CollectionTable(name="city_translation",
joinColumns=@JoinColumn(name="city_id"))
@Column(name="translation")
@MapKeyColumn(name="language")
public Map<String, String> translations = new HashMap<String, String>();
public City(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
public void setTranslation(String language, String translation) {
translations.put(language, translation);
}
public String getTranslation(String language) {
return translations.get(language);
}
}
代理:
package models;
import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
import play.data.validation.*;
@Entity
public class Agent extends Model {
@Required
@Column(unique=true)
public String name;
@Required
@Column(unique=true)
public String email;
@Required
public City city;
public Agent(String name, String email, City city) {
this.name = name;
this.email = email;
this.city = city;
}
}
问题是在数据库 (h2:mem) 中创建代理模型时,城市字段被声明为 varbinary(255) 而不是 bigint,因此它不能保存城市 ID。
因此,当在控制器中我想保存代理时,该字段被正确传递(html:agent.city 是选定的城市 ID),我可以从 params.get("agent.city") 中读取它,但是当我想将其引用为 agent.city 它持有 null:
public static save(Agent agent) {
Logger.info(params.get("agent.id")); // OK - for example: 1
if (agent.city == null)
Logger.info("agent.city is null"); // this is printed
}
如果我将 @Embeddable 添加到 City 类并将 @Embedded 表示法添加到 Agent 的 city 属性,那么我在编译时会出现此错误:
A JPA error occurred (Unable to build EntityManagerFactory): component property not found: id
请告知如何正确设置模型。
我会避免在连接表中使用 OneToOne 关系,因为那时我也需要 City 模型中的参考 id,但 City 模型应该保持独立,它也用于其他模型。
谢谢
【问题讨论】:
-
代理上是否正确填充了任何其他字段或仅填充了 ID?我只是想知道该城市是否从您调用它的表单(我假设)中正确填充。
-
是的,其他所有字段都可以。代理字段:id[bigint]、city[varbinary]、email[varchar]、name[varchar]。城市:id[bigint],name[varchar]。 City_Translation:city_id[bigint],translation[varchar]
标签: hibernate jpa playframework