java - Spring JPA中调用saveAll后相关实体为空

标签 java spring-data-jpa

我有这些实体

NormalizedChannelStock.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);

savedEntities 中返回的实体的 Channel 内部对象设置为 null,以及它们的created_at 和updated_at,如图所示

struct

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

最佳答案

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

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

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

你必须refresh the entity你自己。请注意,仅在同一事务中加载它不会产生任何效果,因为它来自第一级缓存并且是完全相同的实例。

关于java - Spring JPA中调用saveAll后相关实体为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510829/

相关文章:

java - 维护 Camel Route 内的数据库连接

java - 数组对象和元素?

java - Android编程: How do I get out of a while loop?

java - 在线 Java 的 JSON 解析器

java - 如何计算Java中文本文件中每个字母[a-z]的相对频率

hibernate - 为什么这个值对于我的 H2 表来说太长

json - Spring JPA 无法理解此 JSON。可能是什么原因?

spring - JBoss EAP 7.1 Spring-Data-JPA CDI 扩展

java - persistence.xml 使用 java 配置

java - 通过进行单个数据库调用来使用 ArrayList 更新表