我有这些实体
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,如图所示
这是正常行为吗?当我在存储库上运行 findAllById
时,实体内的 Channel
会正确延迟加载,因此我相信实体已正确映射到代码中。问题是在我保存它们之后。
JPA保存实体后是否不重新加载实体?
最佳答案
正如您在评论中所述,您在保存之前没有设置这些值。
JPA 不会为您加载它们。 JPA 在保存时几乎不会加载任何内容,除了由数据库生成的 id 之外。
同一问题/限制/误解的一个更常见的情况是双向关系:JPA 几乎忽略了非拥有方,开发人员必须确保双方始终保持同步。
你必须refresh the entity你自己。请注意,仅在同一事务中加载它不会产生任何效果,因为它来自第一级缓存并且是完全相同的实例。
关于java - Spring JPA中调用saveAll后相关实体为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510829/