gpt4 book ai didi

java - 如何将构建器模式用于具有 JPA 的实体

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:19 26 4
gpt4 key购买 nike

我读到过,当您拥有一个包含大量参数的类时,使用构建器模式很有用。我想知道如何使用构建器模式实现实体。如果能提供示例代码就更好了。

最佳答案

当然可以,您只需要为每个实体提供一个(可能是嵌套的)Builder。

这是一个工作示例:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class FluentEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String someName;
private int someNumber;
private boolean someFlag;

protected FluentEntity(){}

private FluentEntity(String someName, int someNumber, boolean someFlag) {
this.someName = someName;
this.someNumber = someNumber;
this.someFlag = someFlag;
}

public long getId() {
return id;
}

public String getSomeName() {
return someName;
}

public int getSomeNumber() {
return someNumber;
}

public boolean isSomeFlag() {
return someFlag;
}

public static FluentEntityBuilder builder() {
return new FluentEntityBuilder();
}

public static class FluentEntityBuilder {

private String someName;
private int someNumber;
private boolean someFlag;

public FluentEntityBuilder setSomeName(final String someName) {
this.someName = someName;
return this;
}

public FluentEntityBuilder setSomeNumber(final int someNumber) {
this.someNumber = someNumber;
return this;
}

public FluentEntityBuilder setSomeFlag(final boolean someFlag) {
this.someFlag = someFlag;
return this;
}

public FluentEntity build() {
return new FluentEntity(someName, someNumber, someFlag);
}

}

}

使用它的代码是这样的:

FluentEntity entity = FluentEntity.builder().setSomeName(someName).setSomeNumber(someNumber)
.setSomeFlag(someFlag).build();

请记住,如果您有一些自动生成的字段,例如主键(在本例中为 id),则必须排除这些字段。

如果您想摆脱为每个实体创建生成器类的“样板”代码,我会推荐一个方便的库,比如 Lombok。然后您将通过仅注释您的实体来获得您的构建器(甚至更多),排除 id 字段可能需要一些额外的工作。

你应该看看Project Lombok

不过,这里有一些代码来测试这个 Builder(使用 Spring Boot 和 Hibernate 实现)。

存储库:

import org.springframework.data.repository.CrudRepository;

import com.example.model.FluentEntity;

public interface FluentEntityRepository extends CrudRepository<FluentEntity, Long> {

}

下面是一些测试:

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;

import java.util.stream.StreamSupport;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import com.example.model.FluentEntity;

@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest
public class FluentEntityRepositoryTests {

@Autowired
private FluentEntityRepository fluentEntityRepository;

@Test
public void insertAndReceiveFluentEntityCreatedWithBuilder() {
final String someName = "name";
final int someNumber = 1;
final boolean someFlag = true;

FluentEntity entity = FluentEntity.builder().setSomeName(someName).setSomeNumber(someNumber)
.setSomeFlag(someFlag).build();

entity = fluentEntityRepository.save(entity);
assertThat("Entity did not get a generated Id!", entity.getId(), greaterThan(-1L));
assertThat("Entity name did not match!", entity.getSomeName(), is(someName));
assertThat("Entity number did not match!", entity.getSomeNumber(), is(someNumber));
assertThat("Entity flag did not match!", entity.isSomeFlag(), is(someFlag));
}

@Test
public void insertSomeAndReceiveFirst() {
fluentEntityRepository.save(FluentEntity.builder().setSomeName("A").setSomeNumber(1).setSomeFlag(true).build());
fluentEntityRepository
.save(FluentEntity.builder().setSomeName("B").setSomeNumber(2).setSomeFlag(false).build());
fluentEntityRepository.save(FluentEntity.builder().setSomeName("C").setSomeNumber(3).setSomeFlag(true).build());

final Iterable<FluentEntity> findAll = fluentEntityRepository.findAll();
assertThat("Should get some iterable!", findAll, notNullValue());

final FluentEntity fluentEntity = StreamSupport.stream(findAll.spliterator(), false).findFirst().get();
assertThat("Should get some entity!", fluentEntity, notNullValue());
}

}

关于java - 如何将构建器模式用于具有 JPA 的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8111461/

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