2010-05-24 48 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); 

这将适用于所有表格。无需修改映射。

相关问题