Утрачен в спящем режиме - OneToMany приводит к тому, что тот откатывается много раз - PullRequest
0 голосов
/ 24 мая 2010

У меня есть этот дизайн БД:

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Свойства для этого отчета.Теперь, когда я выполняю это:

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

Я получаю отчет 4 раза, а не один раз с картой с 4 свойствами. Честно говоря, я не очень хорош в Hibernate, предпочитаю прямойSQL, но я должен учиться, но я не вижу, что это не так .....?

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 28 мая 2010

Попробуйте использовать это по вашим критериям / запросу:

setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

Это будет работать для всех ваших столов. Нет необходимости изменять сопоставления.

0 голосов
/ 24 мая 2010

Я не знаю ответа на ваш вопрос, но вы могли бы сделать это по-другому и покончить с этим целым 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...