CascadeType.PERSIST不适用于合并操作(对于新实体)

时间:2018-11-26 08:12:13

标签: java spring hibernate spring-data-jpa

此问题基于OneToOne ConstraintViolation while saving a new Record, PK Provided

在该帖子中有两个实体。

   @Data
    @Entity(name = "X_CUSTOMERS")
    public class Customer {

        @Id
        private int customer_Id;

        @NotNull
        private String name;

        private String company_name;

        private String email;

        private String business_phone;

        private String mobile_phone;

        @NotNull
        private String document;

        private String state_registration_number;

        private String state_registration_type;

        private String city_registration_number;

        @NotNull
        private String classification;

        @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
        @JoinColumn(name = "address_id")
        private Address address;

    }


@Data
@Entity(name = "X_ADDRESS")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int address_Id;

    @NotNull
    private String street;

    private String number;

    private String complement;

    private String zip_code;

    private String neighborhood;

    private String city;

    private String state;

}

,请求是:

{
    "customer_Id": 50,
    "name": "name",
    "company_name": "company_name",
    "email": "email@provider.com",
    "business_phone": "(00) 1111-2222",
    "mobile_phone": "(00) 1111-2222",
    "document": "123456789",
    "state_registration_number": "ISENTO",
    "state_registration_type": "NO_CONTRIBUTOR",
    "city_registration_number": "ISENTO",
    "classification": "AUTO",
    "address": {
        "street": "STREET NAME",
        "number": "NUMBER",
        "complement": "COMPLEMENT",
        "zip_code": "ZIP_CODE",
        "neighborhood": "NEIGHBORHOOD",
        "city": "CITY",
        "state": "STATE"
    }
}

由于输入中的customer_id,将调用SimpleJpaRepository的merge方法,并且cascade.persist不起作用。但是将创建一个由所有字段为空值的Address实体,并抛出Constraintviolation(javax.validation.constraints.NotNull.message)。

如果我们使用CascadeType.MERGE而不是CascadeType.PERSIST,它将正常工作

这是休眠中的错误吗?还是这种行为符合JPA规范?

专业JPA书中说:

  

在新实体上调用merge()时,其行为与   persist()操作。它将实体添加到持久性上下文中,   但是它没有添加原始的实体实例,而是创建了一个新的   复制并管理该实例。创建者的副本   将merge()操作持久化,就好像persist()方法是   对其进行调用。   在存在关系的情况下,merge()操作将尝试   更新托管实体以指向的托管版本   分离实体引用的实体。如果实体有一个   与没有永久身份的对象的关系,   合并操作的结果是不确定的。一些提供商可能   允许托管副本指向非持久对象,而   其他人可能会立即抛出异常

我认为级联始终基于所调用的操作来工作,因此,即使对于新实体,级联.persist在调用合并方法时也将不起作用。

我的假设正确吗?

0 个答案:

没有答案