2015-04-27 28 views
1

我已經使用Hibernate 4.3.8創建了一些Hibernate映射。如何從數據庫中引用Hibernate @ManyToOne關聯

@Entity 
@Table(name = ErrorEntity.TABLE_ID) 
@XmlRootElement(name = ErrorEntity.XML_ROOT_TAG) 
public class ErrorEntity { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8083918635458543738L; 

    public static final String TABLE_ID = "Error"; 
    public static final String ERRORCODE = "error_code"; 
    public static final String ENV_ID = "envid"; 

    private Integer error_code; 
    private Integer envId; 
    private EnvironmentEntity environment; 

    public ErrorEntity() { 

    } 

    @Id 
    @Column(name = ErrorEntity.ERRORCODE) 
    public Integer getError_code() { 
     return error_code; 
    } 

    public void setError_code(Integer errorcode) { 
     this.error_code = errorcode; 
    } 

    @Column(name = ErrorEntity.ENV_ID) 
    public Integer getEnvId() { 
     return envId; 
    } 

    public void setEnvId(Integer envId) { 
     this.envId = envId; 
    } 

    @ManyToOne 
    @JoinColumn(name = ErrorEntity.ENV_ID, referencedColumnName = EnvironmentEntity.ENV_ID, insertable = false, updatable = false) 
    public EnvironmentEntity getEnvironment() { 
     return environment; 
    } 

    public void setEnvironment(EnvironmentEntity environment) { 
     this.environment = environment; 
    } 

} 

正如你所看到的映射屬性ENV_ID被映射兩次。

Thisway我想我可以設置JoinColumn值而不需要查詢數據庫來獲取映射的對象,因爲我現在有JoinColumn的值。

ENV_ID的值正確寫入數據庫,但如果稍後查詢此ErrorEntity並嘗試獲取EnvironmentEntity,則引用爲空。

ErrorEntity error = (ErrorEntity) criteria.uniqueResult(); 
System.out.println(error.getEnvironment().getName()); 

getEnvironment()返回null。

任何想法如何實現這一目標?


編輯

這是工作像預計將創造與PK設定一個新的對象。

現在我有一個不起作用的特殊情況。 我需要引用另一個對象,其中joincolumn不是PK。我知道我將加入的價值是獨一無二的,但也有一些我不會加入的重複價值。

然而,Hibernate似乎無法自動映射這種關係。

ErrorEntity error = new ErrorEntity(); 

SignalEntity signal = new SignalEntity(); 
signal.setName(signalName); 

error.setSignal(signal); 

問題是,在這種情況下我沒有signalID(PK)。另一個想法是查詢數據庫,但那太慢了。

我試圖創建一個3列的複合PK,但這打破了另一個地方的邏輯。

是否有可能創建兩個獨立的PK?

+0

你能發表ErrorEntity表的ddl嗎? – Balaji

+0

envId schould被映射一次?爲什麼它被映射兩次? – sgpalit

+0

也可以發佈EnvironmentEntity。當你做一個獲取你得到的價值getEnvId() – Balaji

回答

2

ErrorEntity有兩個ErrorEntity.ENV_ID映射,除非你使用那麼這是一個配置問題。

你應該EnvironmentEntity表有一個env_id列,僅僅是:在ErrorEntity

@ManyToOne 
@JoinColumn(name = ErrorEntity.ENV_ID, referencedColumnName = EnvironmentEntity.ENV_ID, insertable = false, updatable = false) 
public EnvironmentEntity getEnvironment() { 
    return environment; 
} 

映射。

我的建議是消除此:

@Column(name = ErrorEntity.ENV_ID) 
public Integer getEnvId() { 
    return envId; 
} 

直接設置ENVID不查詢數據庫,並要求整個EnvironmentEntity,你可以做這樣的事情:

errrorEntity.setEnvironment(new EnvironmentEntity()); 
errrorEntity.getEnvironment().setEnvId(envId); 

這不是一個JPA標準的要求,但Hibernate支持它。

+0

是的,你是對的,getEnvId乍一看是無稽之談,但正如我所說,我需要一種方式來直接設置envId而不查詢數據庫並請求整個EnvironmentEntity。 – Pascal

+2

是的,你可以。你甚至可以這樣做:'errrorEntity.setEnvironment(new EnvironmentEntity()); errrorEntity.getEnvironment().setEnvId(envId);'它可以工作,而不必查詢數據庫。 –

+0

哇,這對我來說是新的!我在hibernate論壇上直接寫了一篇文章,並在3周後沒有得到答案。將嘗試它:)非常感謝 – Pascal

相關問題