Связанные объекты являются нулевыми после вызова saveAll в Spring JPA - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть эти объекты

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);
    }
}

Канал. 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, а также их созданные_at и updated_at, как показано

struct

Это нормальное поведение? Когда я запускаю findAllById в репозитории, Channel внутри сущностей загружаются лениво правильно, поэтому я считаю, что сущности правильно отображаются в коде. Проблема в том, что после того, как я их спасу. JPA не перезагружает объект после сохранения?

1 Ответ

0 голосов
/ 30 апреля 2020

Как вы указали в комментариях, вы не устанавливали эти значения перед сохранением.

JPA не загружает их для вас. JPA практически ничего не загружает при сохранении, кроме идентификатора, если он генерируется базой данных.

Более распространенным случаем той же проблемы / ограничения / заблуждения являются двунаправленные отношения: JPA в значительной степени игнорирует отсутствие владельца сторона и разработчик должны убедиться, что обе стороны всегда синхронизированы c.

Вы должны обновить sh сущность самостоятельно. Обратите внимание, что простая загрузка в той же транзакции не будет иметь никакого эффекта, потому что она будет поступать из кэша 1-го уровня и будет точно таким же экземпляром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...