gpt4 book ai didi

couchbase - 通过 `wither` 方法填充属性(property)

转载 作者:行者123 更新时间:2023-12-02 23:51:14 25 4
gpt4 key购买 nike

Property Population使用不可变对象(immutable对象)时,它无法按预期工作。

我正在尝试遵循 Property Population spring-data-couchbase-3.1.4.RELEASE reference docs 部分这表明我可以传入一个不可变的实体,并使用适当的 @wither 方法来设置 id。但是,当我尝试时,返回的实体的 ID 值仍然为 null

com/example/demospringdatacouchbaseapp/model/Car.java

import static org.springframework.data.couchbase.core.mapping.id.GenerationStrategy.USE_ATTRIBUTES;
import org.springframework.data.couchbase.core.mapping.Document;
import org.springframework.data.couchbase.core.mapping.id.GeneratedValue;
import org.springframework.data.couchbase.core.mapping.id.IdAttribute;
import com.couchbase.client.java.repository.annotation.Field;
import com.couchbase.client.java.repository.annotation.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Value;
import lombok.experimental.Wither;

@Value
@AllArgsConstructor
@Builder(toBuilder=true)
@Document
public class Car {

public static final String ID_DELIMITER = ".";

@Id
@GeneratedValue(strategy = USE_ATTRIBUTES, delimiter = ID_DELIMITER)
@Wither
String id;

@Field
@IdAttribute(order=0)
String manufacturer;

@Field
@IdAttribute(order=1)
String model;

@Field
@IdAttribute(order=2)
String spec;

@Field
String colour;

}

com/example/demospringdatacouchbaseapp/repository/CarRepository.java

import java.util.Collection;
import org.springframework.data.couchbase.repository.CouchbaseRepository;
import com.example.demospringdatacouchbaseapp.model.Car;

public interface CarRepository extends CouchbaseRepository<Car, String> {

Collection<Car> findByColour(String colour);

}

Create simple car test

  @Test
public void createSingCarTest() {

/*
* Given
*/

Car givenCar = createMadWeeClio();

/*
* When
*/

Car persistedCar = repository.save(givenCar);

/*
* Then
*/

assertThat(persistedCar).isEqualTo(givenCar.withId(getExpectedId(givenCar)));

}

...

private String getExpectedId(Car givenCar) {
return givenCar.getManufacturer() + Car.ID_DELIMITER + givenCar.getModel() + Car.ID_DELIMITER
+ givenCar.getSpec();
}

private Car withExpectedId(Car car) {
return car.withId(getExpectedId(car));
}

private Car createMadWeeClio() {
return Car.builder().manufacturer("RenaultSport").model("Clio").spec("200 Cup").colour("white")
.build();
}

private Car createMadMeg() {
return Car.builder().manufacturer("RenaultSport").model("Megane").spec("R.S Trophy")
.colour("Yellow").build();
}

我期望 CouchbaseRepository::save 操作返回一个不可变实体对象的新实例,并填充自动生成的 ID 属性。但是,它返回为 null 在我的测试中。

传入可变实体会导致 id 字段按预期设置。我还可以看到在 couchbase 中填充了 ID 字段。

最佳答案

我认为问题在于 save 操作并没有创建 Car 对象的新实例 - 相反,它会尝试将 id 设置到该对象上(但是不能,因为它是不可变的)。

@Value Lombok 注释产生的方法如下所示

Car withId(String id) {
return new Car(id, this.model, this.spec, this.colour);
}

但是当您保存对象时,不会调用此方法。

当您从数据库检索对象时,将调用 withId 方法。因此,如果您从数据库返回所有对象(或使用模型等其他条件搜索它),您将看到它们实际上具有带值的 id 属性。该文档在这里介绍了这一点:

https://docs.spring.io/spring-data/couchbase/docs/3.1.4.RELEASE/reference/html/#mapping.property-population

关于couchbase - 通过 `wither` 方法填充属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com