当前位置: 首页 > 知识库问答 >
问题:

在Spring JPA中调用saveAll后,相关实体为空

弘兴言
2023-03-14

我有这些实体

标准化ChannelStock。Java语言

@Entity
@Table(name = "stocks")
public class NormalizedChannelStock {

    @EmbeddedId
    private NormalizedChannelStockId id;

    @Column(name = "qty")
    private int qty;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "channel_id", insertable = false, updatable = false)
    private Channel channel;

    @Column(name = "created_at", updatable = false)
    private Timestamp createdAt;

    @Column(name = "updated_at", updatable = false)
    private Timestamp updatedAt;

    public NormalizedChannelStockId getId() {
        return id;
    }

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

    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }

    public Channel getChannel() {
        return channel;
    }

    public void setChannel(Channel channel) {
        this.channel = channel;
    }

    public Timestamp getCreatedAt() {
        return createdAt;
    }

    public Timestamp getUpdatedAt() {
        return updatedAt;
    }
}

NormalizedChannelStockId。Java语言

@Embeddable
public class NormalizedChannelStockId implements Serializable {

    @Column(name = "channel_id")
    private Integer channelId;

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

    public NormalizedChannelStockId() {
    }

    public NormalizedChannelStockId(Integer channelId, String sku) {
        this.channelId = channelId;
        this.sku = sku;
    }

    public Integer getChannelId() {
        return channelId;
    }

    public void setChannelId(Integer channelId) {
        this.channelId = channelId;
    }

    public String getSku() {
        return sku;
    }

    public void setSku(String sku) {
        this.sku = sku;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NormalizedChannelStockId that = (NormalizedChannelStockId) o;
        return channelId.equals(that.channelId) &&
                sku.equals(that.sku);
    }

    @Override
    public int hashCode() {
        return Objects.hash(channelId, sku);
    }
}

Channel.java

@Entity
@Table(name = "channels")
public class Channel {

    @Id
    @Column(name = "channel_id")
    private int channelId;

    @Column(name = "channel_name")
    private String channelName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "store_id", insertable = false, updatable = false)
    private Store store;

    public int getChannelId() {
        return channelId;
    }

    public void setChannelId(int channelId) {
        this.channelId = channelId;
    }

    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }

    public Store getStore() {
        return store;
    }

    public void setStore(Store store) {
        this.store = store;
    }
}

我面临的问题是

List<NormalizedChannelStock> entitiesToSave = ...
List<NormalizedChannelStock> savedEntities = normalizedChannelStockService.saveAll(entitiesToSave);

如图所示,savedentialities中返回的实体将其通道内部对象设置为null,以及其created\u at和updated\u at

这是正常的行为吗?当我在存储库上运行findAllById时,实体中的Channel被正确地延迟加载,因此我相信实体在代码中被正确映射。问题是在我保存它们之后。JPA保存后没有重新加载实体吗?

共有1个答案

沃驰
2023-03-14

正如您在注释中所述,在保存之前没有设置这些值。

JPA不会为您加载它们。JPA在保存时几乎不加载任何内容,除非id是由数据库生成的。

同一问题/限制/误解的一种更常见的情况是双向关系:JPA几乎忽略了非所有权方,开发人员必须确保双方始终保持同步。

您必须自己刷新实体。请注意,仅在同一事务中加载它不会有任何效果,因为它将来自一级缓存,并且将是完全相同的实例。

 类似资料:
  • 在我的Web应用中,在服务布局中,我对“餐厅”实体使用代理(在“餐厅”字段上使用fetchtype.lazy)。 “get()”进入存储库:

  • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗

  • null 这些类有各自的映射,在数据库模型中,这些表没有关联,在hibernate映射中也没有关联,但是在保存合同时,它必须在字段(业务规则)中具有相同的,但在某些情况下,也给出了没有验证的合同。 我的问题是当我运行HQL查询时: 但Hibernate使用交叉连接语句翻译并合并所有记录。是否有方法在文件中的非相关类之间执行HQL查询? 规则:不应是映射的实体。

  • 在使用Hibernate和Jpa的spring boot应用程序中,我需要在saveAll()之前关闭select,以提高高记录数的性能。 我找到了一个使用JPQL的方法,性能很好(在30s内删除+保存10k条记录),但我希望继续使用hibernate和JPA。 我的期望是,当我运行用Java编写的代码时,我必须删除一个表的所有记录,然后保存另一个表的所有记录。当我以经典的方式(deleteAll

  • 既然有一个,那么当使用时,有没有办法刷新更新的实体? 我试图按批处理更新实体。 真的会有很大的帮助! 非常感谢。

  • 我试图坚持两个实体,它们有一对一和多对一的关系。 我正在尝试将表单集合嵌入到表单中。 我有一个多对一相关的实体,每次我创建一个新的课程简历,它与Candidat列相关candidat_id_id为空。 除了数据可数据中的Candidat id之外,只有实体Curendar umVitae被成功创建和持久化。 简历表 id|titre|candidat_id_id|id_education cand