2010-05-24 49 views
0

我有這個數據庫的設計:與Hibernate迷失 - 一對多導致一個被拉回多次

CREATE TABLE report (
    ID   MEDIUMINT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    user  MEDIUMINT NOT NULL, 
    created  TIMESTAMP NOT NULL, 
    state  INT NOT NULL, 
    FOREIGN KEY (user) REFERENCES user(ID) ON UPDATE CASCADE ON DELETE CASCADE 
); 


CREATE TABLE reportProperties (
    ID   MEDIUMINT NOT NULL, 
    k   VARCHAR(128) NOT NULL, 
    v   TEXT NOT NULL, 
    PRIMARY KEY(
     ID, k 
    ), 
    FOREIGN KEY (ID) REFERENCES report(ID) ON UPDATE CASCADE ON DELETE CASCADE 
); 

這Hibernate的標記:

@Table(name="report") 
@Entity(name="ReportEntity") 
public class ReportEntity extends Report{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="ID") 
    private Integer ID; 
    @Column(name="user") 
    private Integer user; 
    @Column(name="created") 
    private Timestamp created; 
    @Column(name="state") 
    private Integer state = ReportState.RUNNING.getLevel(); 

    @OneToMany(mappedBy="pk.ID", fetch=FetchType.EAGER) 
    @JoinColumns(
      @JoinColumn(name="ID", referencedColumnName="ID") 
    ) 
    @MapKey(name="pk.key") 
    private Map<String, ReportPropertyEntity> reportProperties = new HashMap<String, ReportPropertyEntity>(); 
} 

@Table(name="reportProperties") 
@Entity(name="ReportPropertyEntity") 
public class ReportPropertyEntity extends ReportProperty{ 

    @Embeddable 
    public static class ReportPropertyEntityPk implements Serializable{ 
     /** 
     * long#serialVersionUID 
     */ 
     private static final long serialVersionUID = 2545373078182672152L; 
     @Column(name="ID") 
     protected int ID; 
     @Column(name="k") 
     protected String key; 
    } 

    @EmbeddedId 
    protected ReportPropertyEntityPk pk = new ReportPropertyEntityPk(); 

    @Column(name="v") 
    protected String value; 
} 

並且我在該報告的報告和4屬性中插入了該字段。現在,當我執行這樣的:有圖有4個屬性中

this.findByCriteria(
         Order.asc("created"), 
         Restrictions.eq("user", user.getObject(UserField.ID)) 
        ) 
       ); 

我回來報告的4倍,而不僅僅是一次我不是在休眠很大,說實話,喜歡直接的SQL,但是我必須學習,但我不明白那是什麼錯誤.....?

有什麼建議嗎?

回答

0

我不知道回答你的問題,但你可以做到這一點的另一種方式,並與整個ReportPropertyEntity類做掉:

@CollectionOfElements 
@JoinTable(name = "reportProperties", joinColumns = { @JoinColumn(name = "id") }) 
@MapKey(columns = { @Column(name = "`key`") }) 
@Column(name = "`value`", length = 131070, nullable = false) 
private Map<String, String> reportProperties = new HashMap<String, String>(); 
+0

它可能不是我雖然答案會是,但作品一種享受。我需要在休眠狀態下快速啓動,這會讓我的生活變得更輕鬆......謝謝! – Andy 2010-05-24 18:45:57

+0

您應該使用@ElementCollection。請參閱文檔:「注意 我們建議您從@ org.hibernate.annotations.CollectionOfElements遷移到新的@ElementCollection註釋。」 – Dejell 2010-09-14 12:02:01

0

嘗試在你的標準使用本/查詢:

setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

這將適用於所有表格。無需修改映射。

相關問題