如何使用Java中的hibernate在MySQL数据库中创建联接表?
我有两个实体表,叫做预约和服务。一次预约可以提供多种服务。服务已存储在数据库中。我们可以新增预约。添加新约会时,我们从下拉菜单中选择了添加的服务。可以通过一次预约添加多个服务。我需要在约会表中存储新记录,并在另一个联接表中存储相关约会id和服务id。这里附上我的问题图片 我已经尝试了很多方法来做到这一点。贝娄是一次尝试 这是预约课如何使用Java中的hibernate在MySQL数据库中创建联接表?,mysql,hibernate,spring-boot,Mysql,Hibernate,Spring Boot,我有两个实体表,叫做预约和服务。一次预约可以提供多种服务。服务已存储在数据库中。我们可以新增预约。添加新约会时,我们从下拉菜单中选择了添加的服务。可以通过一次预约添加多个服务。我需要在约会表中存储新记录,并在另一个联接表中存储相关约会id和服务id。这里附上我的问题图片 我已经尝试了很多方法来做到这一点。贝娄是一次尝试 这是预约课 @Entity @Table(name="appointment") public class Appointment extends AbstractPersis
@Entity
@Table(name="appointment")
public class Appointment extends AbstractPersistable<Long> implements Serializable {
@OneToMany
@JoinTable(name = "service_x_appointment", joinColumns = @JoinColumn(name = "appointment_id"),
inverseJoinColumns = @JoinColumn(name = "beautyservice_id"))
Set<BeautyService> beautyServices;
private String type;
private Date date;
private String time;
private String description;
private int approval;
@ManyToOne
@JoinColumn(name = "userid")
private User user;
//getter and setter
}
这是预约服务类别代码
public String save(Appointment appointment) {
appoinmentRepository.save(appointment);
return "Appointment added successfully";
}
这是我的请求主体
{
"type":"Type02",
"date":null,
"time":"20:56",
"description":"Hellow World",
"approval":0,
"user":{
"id":2,
"name" : "Alex",
"telephone" : "0774466886",
"age":21,
"email": null
},
"beautyServices" : [
{
"id":1,
"serviceName":"hair strate",
"timeDuration" : "02 Hours",
"amount" : 5000
},
{
"id":2,
"serviceName":"Eye brows",
"timeDuration" : "02 Hours",
"amount" : 5000
},
{
"id":3,
"serviceName":"Near cutting",
"timeDuration" : "02 Hours",
"amount" : 5000
}
]
}
为什么不在联接表中记录?只有预约表 您绝对不应该像您提到的那样创建联接表实体,因为它更像是底层数据库的表示,而不是面向对象的表示 可以通过定义以下内容来实现联接表:
@Entity
@Table(name="appointment", schema="ADMIN")
public class Appointment implements Serializable {
//...
@OneToMany(mappedBy="appointment")
@JoinTable(name="Join_Table")
Set <ServiceT> service;
如果要明确设置列名,可以使用
@连接柱
注释。您可以通过多种方式进行注释。其中一个被指定为@Aritra Paul,它实际上是
OneToMany
映射的双向表示。
我想您应该使用单向
表示。在这种情况下,您不必使用mappedBy
只需创建如下实体:
@Entity
@Table(name="appointment", schema="ADMIN")
public class Appointment implements Serializable {
@OneToMany
@JoinColumn(name = "appointment_id")
@JoinTable(name = "service_appointment", joinColumns = @JoinColumn(name = "appointment_id"),
inverseJoinColumns = @JoinColumn(name = "service_id"))
Set<Service> services;
}
@Entity
public class Service {
// Some Properties. No need to specify reference of Appointment here.
}
希望这有帮助 请检查beautyServices
是否正确地从@RequestBody绑定
属性名是beautyServices
,而在Json中它表示“服务”
。
在Json中,应该说“beautyServices”
,而不是“service”
另外,检查beautyServices表中是否已经预先存在ID 1、2、3。
如果没有,如果您希望通过保存约会来插入这些内容,则需要添加CASCADETYPE.PERSIST
谢谢您的回答。但我的约会有很多服务。你的答案是否正确。如果错误,请更新。Bcz im new commer for hibernate。如果约会中有多个服务对象,请使用@OneToMany,反之亦然。我已经用@ManyToOne更新了我的回答是否正确?在ServiceT classI中,我更新了我的问题。请你能给我一个解决方案。谢谢。是的。但是我不能在ServiceT类中使用mappedBy和MantToOne什么是基本实体按服务扩展。这是强制性的吗。我曾经尝试过不同的方法。添加约会时,约会表更新成功。但联接表未更新。问题是什么。我用邮递员请求更新了我的问题。@Q只是错误地添加了基本实体。更新了答案。我确实喜欢你,但我的联接表没有更新。我的请求机构有问题吗。请帮助meI更新我的问题。加入像您一样创建的表。但未在该联接表中添加记录。请查看它,保存时是否在约会对象中设置了服务?请添加您用于保存约会的java代码。我的请求可以。我是根据Richa的回答做的。但现在显示的是“java.sql.SQLIntegrityConstraintViolationException:键'UK_cia8m8iqvdfqmt1sjpajvrcia'的重复条目'3'。问题是什么。问题是id 3已在db中保留,请在下次更改您的请求以保留不同的id。根据我的问题,可以有许多服务用于预约。那么每个约会可以是相同的服务id。是的,但服务表中不能有多个具有相同id的服务。顺便说一句,你在beautyServices中添加了cascadeType吗?是的。Beuty服务没有任何复杂的ID。我说过只有jointable可以是双值。不同的约会id可以是jointable中的相同服务。
@Entity
@Table(name="appointment", schema="ADMIN")
public class Appointment implements Serializable {
//...
@OneToMany(mappedBy="appointment")
@JoinTable(name="Join_Table")
Set <ServiceT> service;
@Entity
@Table(name="service", schema="ADMIN")
public class ServiceT implements Serializable {
//...
@ManyToOne
Appointment appointment;
@Entity
@Table(name="appointment", schema="ADMIN")
public class Appointment implements Serializable {
@OneToMany
@JoinColumn(name = "appointment_id")
@JoinTable(name = "service_appointment", joinColumns = @JoinColumn(name = "appointment_id"),
inverseJoinColumns = @JoinColumn(name = "service_id"))
Set<Service> services;
}
@Entity
public class Service {
// Some Properties. No need to specify reference of Appointment here.
}
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| appointment_id | bigint(20) | NO | MUL | NULL | |
| service_id | bigint(20) | NO | PRI | NULL | |
+----------------+------------+------+-----+---------+-------+