我有一个嵌入式模型方案。有一个代理,代理有一个代理所在的城市。
模型看起来如下:
城市:
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)中创建Agent模型时,city字段被声明为varbinary(255)而不是bigint,因此它不能保存City 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表示法添加到代理的city属性,那么我在编译时遇到此错误:
A JPA error occurred (Unable to build EntityManagerFactory): component property not found: id
请建议如何设置模型correclty。
我要避免在连接表中使用OneToOne关系,因为那时我也需要City模型中的引用ID,但City模型应该保持独立,它也用于其他模型。
谢谢
答案 0 :(得分:1)
在Agent实体的City属性上使用@OneToOne。您不必在城市对象中声明OneToOne。这意味着关系将是单向的,但仍然有效。