2011-10-25 52 views
2

我有一個嵌入式模型方案。有一個代理,代理有一個代理所在的城市。如何在播放框架中正確使用嵌入式模型?

該機型正在尋找如下:

市:

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", 
     [email protected](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它擁有空:

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到市級和@Embedded符號添加到代理的城市屬性,然後我在編譯這個錯誤時間:

A JPA error occurred (Unable to build EntityManagerFactory): component property not found: id 

請指教如何設置模型correclty。

我會避免使用與連接表的OneToOne關係,因爲那樣我也需要City模型中的引用ID,但City模型應該保持獨立,它也可以用於其他模型。

謝謝

+0

任何其他字段都正確填充在代理上或只是Id?我只是想知道,如果這個城市是正確填充的(我認爲)你從中調用它。 – emt14

+0

是的其他領域都可以。代理字段:id [bigint],城市[varbinary],電子郵件[varchar],名稱[varchar]。城市:id [bigint],名稱[varchar]。 City_Translation:city_id [bigint],翻譯[varchar] – bdz

回答

1

使用@OneToOne在代理實體的城市屬性。您不必在城市對象中聲明OneToOne。這意味着這種關係將是單向的,但仍然有效。

+0

謝謝,這就是我所缺少的。 – bdz