Java 与冬眠一起迷失-一个浪漫导致一个被多次拉回

Java 与冬眠一起迷失-一个浪漫导致一个被多次拉回,java,mysql,hibernate,hibernate-onetomany,Java,Mysql,Hibernate,Hibernate Onetomany,我有这样的DB设计: 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

我有这样的DB设计:

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>();
}
我已经插入了报告和该报告的4个属性。现在当我执行此操作时:

this.findByCriteria(
                        Order.asc("created"), 
                        Restrictions.eq("user", user.getObject(UserField.ID))
                    )
                );
我四次返回报告,而不是一次返回一个包含4个属性的地图。老实说,我并不擅长Hibernate,我更喜欢纯SQL,但我必须学习,但我看不出这是怎么回事


有什么建议吗?

我不知道你的问题的答案,但你可以用另一种方式来做,并取消整个
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>();
@collectionfements
@JoinTable(name=“reportProperties”,joinColumns={@JoinColumn(name=“id”)})
@MapKey(columns={@Column(name=“`key`”)})
@列(name=“`value`”,长度=131070,null=false)
私有映射reportProperties=newhashmap();

尝试在您的条件/查询中使用此选项:

setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

这将适用于您的所有桌子。无需修改映射。

这可能不是我所认为的答案,但效果不错。我需要沉迷于冬眠,这会让我的生活更轻松…谢谢!您应该使用@ElementCollection。请参见文档中的:“注意,我们建议您从@org.hibernate.annotations.collectionfelments迁移到新的@ElementCollection注释。”
setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);