Как я могу создать таблицу соединений в базе данных MySQL, используя Hibernate в Java? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть две таблицы сущностей, называемые назначением и обслуживанием.Одно назначение может быть много услуг.Услуги уже хранятся в базе данных.Мы можем заново добавить встречу.При добавлении новой встречи мы выбрали добавленные услуги из выпадающего меню.Можно добавить много услуг с одной записью.Мне нужно сохранить новую запись в таблице встреч и сохранить соответствующие идентификаторы встреч и сервисов в другой таблице соединений.Вот прикрепленное изображение с моей проблемой.

enter image description here

Уже я пробовал много способов сделать это.Ниже приведена одна попытка.

Вот класс назначения

@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

}

Вот класс BeautyService

@Entity
@Table(name="beauty_service")
public class BeautyService extends AbstractPersistable<Long>  {


    private String serviceName;
    private String timeDuration;
    private String amount;

    //getter and setter
}

Вот код класса контроллера назначения,

@RequestMapping(value="/createAppointment",method = RequestMethod.POST)
    public String createAppointment(@RequestBody Appointment appointment){

        String response = null;
        response = appointmentService.save(appointment);
        return response;
    }

Вот код класса обслуживания по записи

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
        }
        ]

}

Почему бы не записать в таблицу соединений?Только таблица назначений.

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Вы можете сделать это несколькими способами.Один из них был указан @Aritra Paul, который на самом деле является Bidirectional представлением OneToMany отображения.Я думаю, что вы хотите использовать UniDirectional представление.В этом случае вам не нужно будет использовать 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.

} 

Если вы определите свои сущности таким образом, у вас будет таблица соединения, какэто

+----------------+------------+------+-----+---------+-------+
| Field          | Type       | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| appointment_id | bigint(20) | NO   | MUL | NULL    |       |
| service_id     | bigint(20) | NO   | PRI | NULL    |       |
+----------------+------------+------+-----+---------+-------+

Надеюсь, это поможет !!

0 голосов
/ 24 декабря 2018

Не могли бы вы проверить, действительно ли beautyServices связаны с @RequestBody?

Имя свойства - beautyServices, а в Json - "service".В Json это должно сказать "beautyServices" вместо "service".

Кроме того, убедитесь, что идентификаторы 1, 2, 3 уже существуют в таблице beautyServices.Если нет, если вы хотите, чтобы они также были вставлены путем сохранения встречи, вам нужно добавить CASCADETYPE.PERSIST.

0 голосов
/ 23 декабря 2018

Вы определенно не должны создавать сущность присоединяемой таблицы, как вы упомянули, поскольку это больше базовое представление базы данных, чем объектно-ориентированное.

Вы можете достичь таблицы объединения, определив что-то вроде:

@Entity
@Table(name="appointment", schema="ADMIN")
public class Appointment implements Serializable {
//...

@OneToMany(mappedBy="appointment")
@JoinTable(name="Join_Table")
Set <ServiceT> service;

используйте сопоставление отношений ManyToOne или OneToMany согласно вашей таблице.

@Entity
@Table(name="service", schema="ADMIN")
public class ServiceT implements Serializable {
//...

@ManyToOne
Appointment appointment;

Если вы хотите явно указать имя столбца, вы можете использовать

@ JoinColumn

аннотация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...