gpt4 book ai didi

java - 在 Hibernate 中没有主键的情况下从表中获取实体

转载 作者:行者123 更新时间:2023-11-30 21:48:58 28 4
gpt4 key购买 nike

我目前正在做一个项目,我试图从没有主键的表 (dk_systemtherapie_merkmale) 中获取实体列表。该表与另一个表 (dk_systemtherapie) 是 1:n 相关的。表结构见截图。当获取 dk_systemtherapie 的条目时,程序会获取集合“dkSystemtherapieMerkmalesById”。但是,第一个表条目的获取频率与表中实际条目的数量一样多。它从不从 dk_systemtherapie_merkmale 获取其他条目。我认为这与 hibernate 不能在条目之间有所不同这一事实有关,但我不知道如何解决它。

Table schema

我创建了两个对应的实体类,dk_systemtherapie:

@Entity
@Table(name = "dk_systemtherapie", schema = "***", catalog = "")
public class DkSystemtherapieEntity {
private int id;
private Collection<DkSystemtherapieMerkmaleEntity> dkSystemtherapieMerkmalesById;

@Id
@Column(name = "id")
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@OneToMany(mappedBy = "dkSystemtherapieByEintragId")
public Collection<DkSystemtherapieMerkmaleEntity> getDkSystemtherapieMerkmalesById() {
return dkSystemtherapieMerkmalesById;
}

public void setDkSystemtherapieMerkmalesById(Collection<DkSystemtherapieMerkmaleEntity> dkSystemtherapieMerkmalesById) {
this.dkSystemtherapieMerkmalesById = dkSystemtherapieMerkmalesById;
}
}

这里是第二个,它是在没有主键的情况下访问表,dk_systhemtherapie_merkmale:

@Entity @IdClass(DkSystemtherapieMerkmaleEntity.class)
@Table(name = "dk_systemtherapie_merkmale", schema = "***", catalog = "")
public class DkSystemtherapieMerkmaleEntity implements Serializable {
@Id private Integer eintragId;
@Id private String feldname;
@Id private String feldwert;
private DkSystemtherapieEntity dkSystemtherapieByEintragId;

@Basic
@Column(name = "eintrag_id")
public Integer getEintragId() {
return eintragId;
}

public void setEintragId(Integer eintragId) {
this.eintragId = eintragId;
}

@Basic
@Column(name = "feldname")
public String getFeldname() {
return feldname;
}

public void setFeldname(String feldname) {
this.feldname = feldname;
}

@Basic
@Column(name = "feldwert")
public String getFeldwert() {
return feldwert;
}

public void setFeldwert(String feldwert) {
this.feldwert = feldwert;
}

@Id
@ManyToOne
@JoinColumn(name = "eintrag_id", referencedColumnName = "id")
public DkSystemtherapieEntity getDkSystemtherapieByEintragId() {
return dkSystemtherapieByEintragId;
}

public void setDkSystemtherapieByEintragId(DkSystemtherapieEntity dkSystemtherapieByEintragId) {
this.dkSystemtherapieByEintragId = dkSystemtherapieByEintragId;
}
}

最佳答案

我假设问题与 Hibernate 使用以下注释作为从数据库中获取数据的唯一 ID 这一事实有关。

@Id
@ManyToOne
@JoinColumn(name = "eintrag_id", referencedColumnName = "id")
public DkSystemtherapieEntity getDkSystemtherapieByEintragId() {
return dkSystemtherapieByEintragId;
}

这会导致问题,当获得多个具有相同 ID 的条目时(因为 ID 不是唯一的),您将获得您想要的条目数,但 hibernate 总是获取该 ID 的第一个条目.所以实际上你得到了重复的条目。

那么如何解决这个问题呢?

根据这个问题:Hibernate and no PK ,有两种解决方法实际上仅在您的表中没有 NULL 条目(否则返回的对象也将为 NULL)并且没有 1:n 关系时才有效。据我了解,hibernate 不支持没有主键(documentation)的表上的实体。为确保获得正确的结果,我建议使用 NativeQuery。

删除注释和 private DkSystemtherapieEntity dkSystemtherapieByEintragId; (包括 beans)来自 DkSystemtherapieMerkmaleEntity.java 并添加一个构造函数。

public class DkSystemtherapieMerkmaleEntity {
private Integer eintragId;
private String feldname;
private String feldwert;

public DkSystemtherapieMerkmaleEntity(Integer eintragId, String feldname, String feldwert) {
this.eintragId = eintragId;
this.feldname = feldname;
this.feldwert = feldwert;
}

public Integer getEintragId() {
return eintragId;
}

public void setEintragId(Integer eintragId) {
this.eintragId = eintragId;
}

public String getFeldname() {
return feldname;
}

public void setFeldname(String feldname) {
this.feldname = feldname;
}

public String getFeldwert() {
return feldwert;
}

public void setFeldwert(String feldwert) {
this.feldwert = feldwert;
}
}

删除 private Collection<DkSystemtherapieMerkmaleEntity> dkSystemtherapieMerkmalesById; (包括 beans)来自 DkSystemtherapieEntity.java。

总是当您需要获取特定 eintrag_id 的条目时,请使用以下方法而不是 DkSystemtherapieEntity.java 中的 Collection。

public List<DkSystemtherapieMerkmaleEntity> getDkSystemtherapieMerkmaleEntities(int id) {
Transaction tx = session.beginTransaction();
String sql = "SELECT * FROM dk_systemtherapie_merkmale WHERE eintrag_id =:id";

List<Object[]> resultList;
resultList = session.createNativeQuery(sql)
.addScalar("eintrag_id", IntegerType.INSTANCE)
.addScalar("feldname", StringType.INSTANCE)
.addScalar("feldwert", StringType.INSTANCE)
.setParameter("id", id).getResultList();

tx.commit();

List<DkSystemtherapieMerkmaleEntity> merkmale = new ArrayList<>();
for (Object[] o : resultList) {
merkmale.add(new DkSystemtherapieMerkmaleEntity((Integer) o[0], (String) o[1], (String) o[2]));
}

return merkmale;
}

调用getDkSystemtherapieMerkmaleEntities(dkSystemtherapieEntityObject.getid())而不是 getDkSystemtherapieMerkmalesById() .

关于java - 在 Hibernate 中没有主键的情况下从表中获取实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48151606/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com