我基本上有一个预订系统,包括预订、员工和客户。
我想保留一个预订实体。预订实体有一个员工(将提供服务)和一个客户(预订是为其发生的)。
我希望能够保留一个预订对象,如果该对象已经存在,则不会在其中创建员工和/或客户。我如何通过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时,它都会在数据库中创建一个新的员工记录。
我建议你提供一个实体的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生成实体类和会话