如何使用Java中的hibernate在MySQL数据库中创建联接表?

如何使用Java中的hibernate在MySQL数据库中创建联接表?,mysql,hibernate,spring-boot,Mysql,Hibernate,Spring Boot,我有两个实体表,叫做预约和服务。一次预约可以提供多种服务。服务已存储在数据库中。我们可以新增预约。添加新约会时,我们从下拉菜单中选择了添加的服务。可以通过一次预约添加多个服务。我需要在约会表中存储新记录,并在另一个联接表中存储相关约会id和服务id。这里附上我的问题图片 我已经尝试了很多方法来做到这一点。贝娄是一次尝试 这是预约课 @Entity @Table(name="appointment") public class Appointment extends AbstractPersis

我有两个实体表,叫做预约和服务。一次预约可以提供多种服务。服务已存储在数据库中。我们可以新增预约。添加新约会时,我们从下拉菜单中选择了添加的服务。可以通过一次预约添加多个服务。我需要在约会表中存储新记录,并在另一个联接表中存储相关约会id和服务id。这里附上我的问题图片

我已经尝试了很多方法来做到这一点。贝娄是一次尝试

这是预约课

@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    |       |
+----------------+------------+------+-----+---------+-------+