当前位置: 首页 > 知识库问答 >
问题:

SpringBoot JPA relationsships-如果对象存在,则防止创建新的实体,而是返回已经存在的对象

杜俭
2023-03-14

我有一个用控制器、服务和存储库逻辑构建的客户实体。

我还有一个Address实体,只有一个简单的POJO和@OneTomany注释。

如果我用相同的地址属性发出两个POST请求--如果这些地址属性已经存在于数据库中,我如何告诉我的应用程序--阻止在数据库中添加新实体,而是返回已经存在的实体?

例如。员额请求:

// First request
{
    "name": "Foo",
    "contact": "123456",
    "email": "Foo@gmail.com",
    "address": {
        "street": "Wall street", 
        "postalCode": 10,
        "houseNo": "45",
        "city": "New York"
    }
}

// Second request
{
    "name": "Bar",
    "contact": "5321",
    "email": "Bar@gmail.com",
    "address": {
        "street": "Wall street", <----- same as first request
        "postalCode": 10, <----- same as first request
        "houseNo": "45", <----- same as first request
        "city": "New York" <----- same as first request
    }
}

这是获取所有客户时的结果:

[
    {
        "id": 1,
        "name": "Foo",
        "contact": "123456",
        "email": "Foo@gmail.com",
        "address": {
            "id": 1,
            "street": "Wall street",
            "postalCode": 10,
            "houseNo": "45",
            "city": "New York"
        }
    },
    {
        "id": 2,
        "name": "Bar",
        "contact": "5321",
        "email": "Bar@gmail.com",
        "address": {
            "id": 2, <---------------- expect this ID to be 1 
            "street": "Wall street",
            "postalCode": 10,
            "houseNo": "45",
            "city": "New York"
        }
    }
]

这里是必要的信息(if)需要帮助我进行我的小项目。

customer.java

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
@Entity
@Table
public class Customer {
    @Id
    @SequenceGenerator(
            name = "customer_sequence",
            sequenceName = "customer_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "customer_sequence"
    )
    private Long id;
    private String name;
    private String contact;
    private String email;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id", nullable = false)
    private Address address;
    [...]

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
@Entity
@Table
public class Address {
    @Id
    @SequenceGenerator(
            name = "address_sequence",
            sequenceName = "address_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "address_sequence"
    )
    private Long id;
    private String street;
    private int postalCode;
    private String houseNo;
    private String city;

    @JsonIgnore
    @OneToMany(mappedBy = "address")
    private Set<Customer> customers;
    [...]
//...
@PostMapping
    public void createCustomer(@RequestBody Customer customer) {
        customerService.createCustomer(customer);
    }

[...]

和将客户保存到数据库的服务:

//...
public void createCustomer(Customer customer) {
        customerRepository.save(customer);
    }

[...]

共有1个答案

子车修平
2023-03-14

您可以用您的地址参数创建一个散列,并保持类似;

"street": "Wall street",
"postalCode": 10,
"houseNo": "45",
"city": "New York"
"uid": "3rn3u924917vt8r78b17vxver"

当您获得一个新地址时,可以用它创建一个散列,并用该散列获得地址。如果该散列中存在任何地址,则获取该地址并将其放入customer对象中并保存。

 类似资料:
  • 我在代码优先的情况下使用EF,我有这样的模型: 我收到一个客户ID和一个产品ID列表。当产品在数据库中不存在时,我想添加它: 问题是EF试图级联更改并尝试插入一个新的对象,其ID与现有对象相同,因此失败。我如何解决这个问题? 这是插入方法:

  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 我有两个程序。第一个分配共享内存文件,第二个从中读取。。我使用placement new将对象放置到此内存中,以确保对象不会使用新的或分配共享内存文件之外的任何内存。 我的阵列结构: 方案1: 方案2: > 程序一将SHMArray放置在内存中,位置为new。程序二在程序一已经放置的对象上做同样的事情(覆盖它)。这是未定义的行为吗?我认为不是,但我想确认一下。 两个程序都不调用析构函数数组- 我基

  • 我试图将每个列表都位于嵌套对象内的webservice模型映射到更简单的对象。 模型1 映射非常简单: 映射工作正常,除了一个问题。当我将带有null子级的父母映射到父母2并返回父母时,儿童对象是用空列表创建的。有什么方法可以防止这种情况吗?

  • 你知道吗?也许有更好的办法?

  • 我希望有人能为我在Spring Boot项目中对JPA实体的困惑提供一些帮助。我听说在Spring项目中不应该调用< code>new。我知道这是为了让Spring管理所有的bean,可以通过注入或通过应用程序上下文显式地获得bean。 但是,我不清楚如何获得新的 JPA 实体。如果我有一个用 注释的类和一个处理数据访问的存储库类,如何在服务层中获取新的实体对象? 我已经在应用程序的主类中包含,所