Java Can';无法在hibernate中保存实体

Java Can';无法在hibernate中保存实体,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,我创建了简单的CRUD服务。有4个实体:客户、提供商、产品、交易 Customer和Provider实体已将idAppId组合为以下结构: @Getter @Setter @Embeddable @NoArgsConstructor public class AppId implements Serializable { private String app; private String id; //... } 以下是我想要的业务逻辑: 提供者实体级联并创建产品实体。

我创建了简单的CRUD服务。有4个实体:客户、提供商、产品、交易

Customer
Provider
实体已将id
AppId
组合为以下结构:

@Getter
@Setter
@Embeddable
@NoArgsConstructor
public class AppId implements Serializable {
    private String app;
    private String id;
    //...
}
以下是我想要的业务逻辑: 提供者实体级联并创建产品实体。 当客户与提供商达成交易时,我需要创建实体
交易
,它不会级联任何其他实体。 它只是有一些字段,这些字段涉及交易的提供者、客户和产品

我创建了一些提供商和客户。 然后我尝试创建交易,但我得到了customer和provider字段
null

以下是我的实体定义:
提供者

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

产品

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

交易

@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;
}
@实体
@吸气剂
@塞特
@托斯特林
@诺尔格构装师
@表(name=“deal”)
公共类处理实现了可序列化{
@身份证
@生成值
私人长id;
@许多酮
@连接柱({
@JoinColumn(name=“provider\u app”,referencedColumnName=“app”,insertable=false,updateable=false),
@JoinColumn(name=“provider\u id”,referencedColumnName=“id”,insertable=false,updateable=false)
})
私人供应商;
@许多酮
@连接柱({
@JoinColumn(name=“customer\u app”,insertable=false,updateable=false),
@JoinColumn(name=“customer\u id”,insertable=false,updateable=false)
})
私人客户;
@许多
@JoinTable(name=“交易\产品”
,joinColumns=@JoinColumn(name=“deal\u id”,insertable=false,updateable=false)
,inverseJoinColumns=@JoinColumn(name=“product_id”,insertable=false,updateable=false))
私有集合产品;
//当提供商输入交易id时,交易完成
@列(name=“closed”)
私有布尔闭合=假;
}

通过删除
交易
实体中
客户
提供商
字段的
insertable=false
,一切正常

    {
    "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
并不意味着您将创建新的
客户
提供商
,这是由
CascadeType

处理的,为什么
Deal
实体中的
provider
customer
字段有
insertable=false
呢?@苛刻,因为在创建
Deal
实体时,您不能创建新的
provider
customer
<代码>交易只能在以前创建了
提供商
客户
的情况下创建。请在创建和保存交易的位置共享代码,不查看任何内容很难说出任何内容that@harsh链接到项目:当创建不正确的交易时,它会重写提供者实体