Hibernate - OneToMany只检索一行

时间:2018-01-04 17:31:21

标签: java postgresql hibernate one-to-many

我有以下具有@OneToMany关系的类,但它只返回两行中的一行:

@Entity
@javax.persistence.Table(name = "as_itm_ext")
public class ItemExtensionEntity implements java.io.Serializable {

    @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    @JoinColumns({ @JoinColumn(name = "id_itm", referencedColumnName = "id_itm", insertable = false, updatable = false) })
    public Set<ItemAttributeEntity> getItemAttributeEntities() {
        return this.itemAttributeEntities;
    }

    public void setItemAttributeEntities(Set<ItemAttributeEntity> itemAttributeEntities) {
        this.itemAttributeEntities = itemAttributeEntities;
    }
}

要检索的课程:

@Entity
@javax.persistence.Table(name = "as_itm_att")
public class ItemAttributeEntity implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * AttributeKey,The key of the attribute.
     */
    private ItemAttributeEntityId id;

    /**
     * AttributeValue,The value of the attribute.
     */
    private String attributeValue;

    public ItemAttributeEntity() {
    }

    public ItemAttributeEntity(ItemAttributeEntityId id, String attributeValue) {
        this.id = id;
        this.attributeValue = attributeValue;
    }

    /**
     * AttributeKey,The key of the attribute.
     */
    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "itemId", column = @Column(name = "id_itm", nullable = false, length = 32)),
            @AttributeOverride(name = "attributeKey", column = @Column(name = "att_key", nullable = false, length = 32)) })
    public ItemAttributeEntityId getId() {
        return this.id;
    }

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

    /**
     * AttributeValue,The value of the attribute.
     */
    @Column(name = "att_value", nullable = false, length = 32)
    public String getAttributeValue() {
        return this.attributeValue;
    }

    public void setAttributeValue(String attributeValue) {
        this.attributeValue = attributeValue;
    }

}

我已经尝试将Set更改为List,但没有运气(在阅读了一些关于它们之间的差异后,更改它没有任何意义。)

我不知道发生了什么,也不确定它是否总是那样。

谢谢!

更新:尝试实施equals,没有任何反应。

2 个答案:

答案 0 :(得分:1)

根据我的理解,您需要在ItemExtensionEntity课程中添加ItemAttributeEntity的引用(如@ManyToOne) 在您的实体ItemExtensionEntity

上的@OneToMany注释中添加mappedby属性

参考:Can someone please explain mappedBy in hibernate?

@Entity
@javax.persistence.Table(name = "as_itm_ext")
public class ItemExtensionEntity implements java.io.Serializable {

    @OneToMany(mappedBy="parentEntity" ,fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    //@JoinColumns({ @JoinColumn(name = "id_itm", referencedColumnName = "id_itm", insertable = false, updatable = false) })
    public Set<ItemAttributeEntity> getItemAttributeEntities() {
        return this.itemAttributeEntities;
    }

    public void setItemAttributeEntities(Set<ItemAttributeEntity> itemAttributeEntities) {
        this.itemAttributeEntities = itemAttributeEntities;
    }
}


@Entity
@javax.persistence.Table(name = "as_itm_att")
public class ItemAttributeEntity implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * AttributeKey,The key of the attribute.
     */
    private ItemAttributeEntityId id;

    /**
     * AttributeValue,The value of the attribute.
     */
    private String attributeValue;

    @ManyToOne
    @JoinColumn(name="<columnname>", nullable=false)
    private ItemExtensionEntity parentEntity;

    //add getter and setters

    public ItemAttributeEntity() {
    }

    public ItemAttributeEntity(ItemAttributeEntityId id, String attributeValue) {
        this.id = id;
        this.attributeValue = attributeValue;
    }

    /**
     * AttributeKey,The key of the attribute.
     */
    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "itemId", column = @Column(name = "id_itm", nullable = false, length = 32)),
            @AttributeOverride(name = "attributeKey", column = @Column(name = "att_key", nullable = false, length = 32)) })
    public ItemAttributeEntityId getId() {
        return this.id;
    }

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

    /**
     * AttributeValue,The value of the attribute.
     */
    @Column(name = "att_value", nullable = false, length = 32)
    public String getAttributeValue() {
        return this.attributeValue;
    }

    public void setAttributeValue(String attributeValue) {
        this.attributeValue = attributeValue;
    }

}

答案 1 :(得分:1)

尝试在 itemAttributeEntities 上使用 fetch = FetchType.LAZY