Не могу сохранить сущность в спящем режиме - PullRequest
0 голосов
/ 06 ноября 2018

Я создал простой сервис CRUD. С 4 юридическими лицами: Клиент, Поставщик, Продукт, Сделка.

Объекты

Customer и Provider имеют идентификатор AppId со следующей структурой:

@Getter
@Setter
@Embeddable
@NoArgsConstructor
public class AppId implements Serializable {
    private String app;
    private String id;
    //...
}

Вот бизнес-логика, которую я хочу: Сущности провайдеров каскадируются и создаются сущности продукта. Когда клиент заключает сделку с провайдером, мне нужно создать сущность Deal, которая не каскадирует никакие другие сущности. В нем есть поля, которые относятся к поставщику, клиенту и продукту сделки.

Я создал несколько провайдеров и клиентов. Тогда я попытался заключить сделку, но я получил поля клиента и поставщика null.

Imgur Imgur

Вот мои определения сущностей:


Provider
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "provider")
public class Provider implements Serializable {

    @EmbeddedId
    @Column(name = "appid")
    private AppId appId;

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

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

    @Column(name = "latitude")
    private float latitude;

    @Column(name = "longitude")
    private float longitude;

    @Column(name = "work_date")
    private Date workDate;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "provider_product"
            , joinColumns = {
                @JoinColumn(name = "provider_app"),
                @JoinColumn(name = "provider_id")
            }
            , inverseJoinColumns = @JoinColumn(name="product_id"))
    private Set<Product> products;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumns({
            @JoinColumn(name = "app", referencedColumnName = "app", updatable = false, insertable = false),
            @JoinColumn(name = "id", referencedColumnName = "id", updatable = false, insertable = false)
    })
    private List<Deal> dealList = new ArrayList<>();
}


Customer
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "customer")
public class Customer implements Serializable {

    @EmbeddedId
    @Column(name = "appid")
    private AppId appId;

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

    public Customer(AppId appId, String firstName, String lastName) {
        this.appId = appId;
        this.firstName = firstName;
        this.lastName = lastName;
    }
}


Product:
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "product")
public class Product implements Serializable {

    @Id
    @GeneratedValue
    private long id;

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

    @Column(name = "cost")
    private long cost;
}


Deal
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "deal")
public class Deal implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "provider_app", referencedColumnName = "app", insertable = false, updatable = false),
            @JoinColumn(name = "provider_id", referencedColumnName = "id", insertable = false, updatable = false)
    })
    private Provider provider;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "customer_app", insertable = false, updatable = false),
            @JoinColumn(name = "customer_id", insertable = false, updatable = false)
    })
    private Customer customer;

    @ManyToMany
    @JoinTable(name = "deal_product"
            , joinColumns = @JoinColumn(name="deal_id", insertable = false, updatable = false)
            , inverseJoinColumns = @JoinColumn(name="product_id", insertable = false, updatable = false))
    private Set<Product> product;

    // deal is complete when provider entered deal id
    @Column(name = "closed")
    private boolean closed = false;
}

1 Ответ

0 голосов
/ 06 ноября 2018

При удалении insertable = false для customer и provider полей в сущности Deal все работает нормально.

    {
    "id": 5,
    "provider": {
        "appId": {
            "app": "vk",
            "id": "123"
        },
        "name": null,
        "firstName": null,
        "lastName": null,
        "latitude": 0,
        "longitude": 0,
        "workDate": null,
        "products": null,
        "dealList": []
    },
    "customer": {
        "appId": {
            "app": "vk",
            "id": "123"
        },
        "firstName": null,
        "lastName": null
    },
    "product": [
        {
            "id": 2,
            "name": "Temp",
            "cost": 100
        }
    ],
    "closed": false
}

Я мог бы получить следующий ответ.

insertable = false в поле означает, что когда вы сохраняете сущность, вы не будете сохранять значение для этого поля и будете явно устанавливать поле где-либо.

insertable = true не означает, что вы создадите новый Customer или Provider, который обрабатывается CascadeType

...