此问题基于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在调用合并方法时也将不起作用。
我的假设正确吗?