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

如何保留两个对象,但只更新一个,如果它已经存在

潘修文
2023-03-14

我基本上有一个预订系统,包括预订、员工和客户。

我想保留一个预订实体。预订实体有一个员工(将提供服务)和一个客户(预订是为其发生的)。

我希望能够保留一个预订对象,如果该对象已经存在,则不会在其中创建员工和/或客户。我如何通过JPA和hibernate实现这一点。

我还想保留我现有的模式(预订表、员工表、客户表以及预订客户、预订员工之间的关系表…)

以下是预订实体:

@Entity
@Table(name = "bookings")
@EntityListeners(AuditingEntityListener.class)
public class Booking
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "booking_id")
    private Long id;

    @Column(name = "title")
    private String title;

    @Column(name = "description")
    private String description;

    @Column(name = "service")
    private String service;

    @NotNull(message = "status is mandatory")
    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    private BookingStatus status;

    @Column(name = "scheduled_at", nullable = false)
    private LocalDateTime scheduledAt;

    @Column(name = "created_at")
    @CreationTimestamp
    private LocalDateTime createdAt;

    @Column(name = "updated_at")
    @UpdateTimestamp
    private LocalDateTime updatedAt;

    @ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinTable(name = "booking_customer", joinColumns = {@JoinColumn(name = "booking_id")}, inverseJoinColumns = {@JoinColumn(name = "customer_id")})
    private Customer customer;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinTable(name = "booking_employee", joinColumns = {@JoinColumn(name = "booking_id")}, inverseJoinColumns = {@JoinColumn(name = "employee_id")})
    private Employee employee;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinTable(name = "booking_address", joinColumns = {@JoinColumn(name = "booking_id")}, inverseJoinColumns = {@JoinColumn(name = "address_id")})
    private Address address;
}

这里是客户实体:

@Entity
@Table(name = "customers")
@EntityListeners(AuditingEntityListener.class)
public class Customer
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "customer_id")
    private Long id;

    @NotBlank(message = "firstName is mandatory")
    @Column(name = "first_name")
    private String firstName;

    @NotBlank(message = "lastName is mandatory")
    @Column(name = "last_name")
    private String lastName;

    @NotBlank(message = "email is mandatory")
    @Column(name = "email_address")
    private String email;

    @NotBlank(message = "phoneNumber is mandatory")
    @Column(name = "phone_number")
    private String phoneNumber;

    @Column(name = "created_at")
    @CreationTimestamp
    private LocalDateTime createdAt;

    @Column(name = "updated_at")
    @UpdateTimestamp
    private LocalDateTime updatedAt;

    @OneToMany(mappedBy = "customer", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Booking> bookings;
 }

这里是雇员实体:

@Entity
@Table(name = "employees")
@EntityListeners(AuditingEntityListener.class)
public class Employee
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "employee_id")
    private Long id;

    @NotBlank(message = "firstName is mandatory")
    @Column(name = "first_name")
    private String firstName;

    @NotBlank(message = "lastName is mandatory")
    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email_address")
    private String email;

    @NotBlank(message = "phoneNumber is mandatory")
    @Column(name = "phone_number")
    private String phoneNumber;

    @Column(name = "created_at")
    @CreationTimestamp
    private LocalDateTime createdAt;

    @Column(name = "updated_at")
    @UpdateTimestamp
    private LocalDateTime updatedAt;

    @OneToMany(mappedBy = "employee", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Booking> bookings;

}

为了清晰起见,我去掉了getter和setter。

我想能够坚持与客户和员工通过邮递员这样的预订

{
    "title": "Haircut & Beards with Aymen",
    "description": "I would like to clean shave my head",
    "service": "COUPE-12 Haircut",
    "status": "PENDING",
    "scheduledAt": "2021-08-10T15:50:05.609",
    "customer": {
        "firstName": "Raz",
        "lastName": "ari",
        "email": "bena97@gpil.com",
        "phoneNumber": "5149455541"
    },
    "employee": {
        "firstName": "Garcon",
        "lastName": "Mansur",
        "email": "mansur@gmail.com",
        "phoneNumber": "541659898"
    },
    "address": {
        "location": "10424 rue du loili, Montreal, H9P1Z5"
    }
}

大多数时候,预订中的员工实体将是数据库中已经存在的员工,但是现在每次我发布这个JSON时,它都会在数据库中创建一个新的员工记录。

共有1个答案

干照
2023-03-14

我建议你提供一个实体的id字段,Hibernate会自动检查和设置。如果没有,它会创建新的记录。但是如果不可能的话,就像@YoManToMero提到的那样手动检查它

 类似资料:
  • 我目前正在学习打字稿,我遇到了一个对我来说不太有意义的错误。 以下函数有一个对象作为参数 还有一个具有两种泛型类型的。 现在,我创建了一个名为的对象,它接受一个对象和一个字符串。 当我调用函数<code>addId</code>时,它抛出以下错误:<code>Generic type‘UserInterface 我不明白为什么我会有这个错误,因为< code>user对象有< code>name

  • 问题内容: 在Session类的JavaDoc中,delete方法的描述为: 从数据存储中删除 持久性实例 。该自变量可以是与接收会话相关联的实例,也可以是具有与现有持久状态相关联的标识符的瞬时实例。 我的问题是: 我想删除一个分离对象,可以使用这种方法吗?AFAIK会话首先使对象从分离中持久化,然后执行其操作。我对吗? 如果不确定数据库中是否存在该对象,是否应该使用Session.get()检查

  • 无法在密钥斗篷版本 15.0.2 上使用键斗导入键斗导入领域 json。我正在 Docker 容器中运行 keycloak。 下面是compose中的docker卷 卷: KeyClope的环境变量 导入失败,出现已存在错误。使用迁移策略时也会出现同样的错误。 即使领域存在,如何导入? 来自钥匙扣的错误: 04:47:48,047 INFO[org.keycloak.services](Serve

  • 问题内容: 我有一个字段为Foreign_key_id的表| value1 | value2,如果我有对Foreign_key_id和value1的匹配项,我想更新value2。 如果foreign_key_id或value1不存在,我想插入一个新行。有没有比PHP使用select语句然后分支到更新或插入更好的方法呢? 编辑:value2可以与数据库中的值相同,因此我无法运行和更新,请查看受影响的

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

  • 问题内容: 我在Web应用程序中使用了JPA,但我想不出如何持久化彼此相关的两个新实体。这里是一个例子: 这是两个实体 该 消费者 有一个 ID 和其他一些价值观。该 ProfilePicture 使用 消费者 的 ID ,因为它是自己的主键和外键。(由于没有使用者,ProfilePicture将不存在,并且并非每个使用者都具有ProfilePicture) 我使用NetBeans生成实体类和会话