我有這個數據庫的設計:與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,但是我必須學習,但我不明白那是什麼錯誤.....?
有什麼建議嗎?
它可能不是我雖然答案會是,但作品一種享受。我需要在休眠狀態下快速啓動,這會讓我的生活變得更輕鬆......謝謝! – Andy 2010-05-24 18:45:57
您應該使用@ElementCollection。請參閱文檔:「注意 我們建議您從@ org.hibernate.annotations.CollectionOfElements遷移到新的@ElementCollection註釋。」 – Dejell 2010-09-14 12:02:01