Почему Hibernate выбирает одни и те же столбцы 4 раза? Помогите с картированием? - PullRequest
4 голосов
/ 25 августа 2011

Мои занятия выглядят так. Почему один и тот же столбец выбирается 4 раза? В чем проблема с отображением?

@Entity @Table(name="CLIENTS")
public class Client implements Serializable {

  @Id @GeneratedValue   @Column(name="GENERATED_ID")
  private Long id;

  @Column(name="NAME")
  private String name;

  @OneToMany(cascade=CascadeType.ALL, mappedBy="client", fetch=FetchType.EAGER)
  private Map<ParamPK, Param> params = new HashMap<ParamPK, Param>();
}

@Entity @Table(name="PARAMS")
public class Param implements Serializable {

  @EmbeddedId
  private ParamPK paramPK;

  @Column(name="VALUE")
  private String value;

  @ManyToOne @MapsId("clientId")
  private Client client;
}

@Embeddable
public class ParamPK implements Serializable {

  @Column(name="PARAM_KEY")
  private String key;

  @Column(name="CLIENT_GENERATED_ID")
  private Long clientId;
}

Запросы, сгенерированные оператором select, получают один и тот же столбец 4 раза.

/* from Client */ 
select
    client0_.GENERATED_ID as GENERATED1_1_,
    client0_.NAME as NAME1_ 
from
    CLIENTS client0_

/* load one-to-many Client.params */ 
select
    params0_.client_GENERATED_ID as client3_1_1_,
    params0_.client_GENERATED_ID as client3_1_,
    params0_.PARAM_KEY as PARAM1_1_,
    params0_.CLIENT_GENERATED_ID as CLIENT3_1_,
    params0_.client_GENERATED_ID as client3_0_0_,
    params0_.PARAM_KEY as PARAM1_0_0_,
    params0_.VALUE as VALUE0_0_ 
from
    PARAMS params0_ 
where
    params0_.client_GENERATED_ID=?

Примечание с использованием Hibernate 3.5.3. Остальной шаблон кода был удален как неактуальный.

1 Ответ

3 голосов
/ 26 августа 2011

Вы забыли сообщить Hibernate, что составляет ключ карты параметров. Добавьте следующую аннотацию к этой карте:

@OneToMany(cascade=CascadeType.ALL, mappedBy="client", fetch=FetchType.EAGER)
@MapKey(name = "paramPK")
private Map<ParamPK, Param> params = new HashMap<ParamPK, Param>();

Это говорит Hibernate, что свойство paramPK сущности Param является ключом карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...