我有一个嵌入的模型方案。有一个座席,而且座席所在的城市也是座席所在的城市。
这些模型如下所示:
城市:
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)中创建代理模型时,city字段被声明为varbinary(255),而不是bigint,因此它不能保存City id。
因此,当我想在控制器中保存一个代理时,这个字段被正确地传递了(html: agent.city是选定的城市id),我可以从params.get(" agent.city ")中读取它,但是当我想把它作为agent.city引用时,它保持为空:
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模型应该保持独立,它也用于其他模型中。
谢谢
发布于 2011-10-26 16:39:29
在Agent实体的City属性上使用@OneToOne。您不必在城市对象中声明OneToOne。这意味着该关系将是单向的,但仍然有效。
https://stackoverflow.com/questions/7895973
复制相似问题