Hibernate добавить объект с внешним ключом, используя REST - PullRequest
0 голосов
/ 10 ноября 2018

Прежде всего, я не написал никаких операторов SQL для создания таблицы. Я пытаюсь использовать Hibernate / jpa только без написания SQL.

Мои отношения следующие: у пользователя может быть много задач, у задачи есть только один пользователь.

Я создал свои модели так:

Таблица пользователей:

@Entity
@Table(name="T_USER")
@EntityListeners(AuditingEntityListener.class)
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "uid")
    private Long uid;
...
}

Таблица задач:

@Entity
@Table(name = "T_TASK")
@EntityListeners(AuditingEntityListener.class)
public class TASK{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long tid;

    @ManyToOne
    @JoinColumn(name ="oid")
    private User owner;

    public User getOwner() {
        return owner;
    }

    public void setOwner(User owner) {
        this.owner = owner;
    }
...
}

Отношение - это идентификатор владельца задачи (oid) - это идентификатор пользователя.

Чтобы сохранить пользователя в моей базе данных, я использую почтальона со следующими параметрами:

{
    "username": "firstuser",
    "email": "firstuser@email.com"
}

Чтобы сохранить задачу в моей базе данных, я использую это:

{
    "description": "some description",
    "oid": "12" // I also can state username of the user rather than ID
}

Однако, когда я выполняю save задачу, oid задачи равен NULL. В объектах доступа к данным у меня есть:

@PostMapping("/save")
public QR createTask(@Valid @RequestBody Task task)
{
    return taskDAO.save(task);
}

1-Что я делаю не так? Я просто хочу добавить задачу с идентификатором владельца в базу данных, однако она возвращает null как ownerid.

2 - Должен ли я сначала создать таблицу с помощью SQL, используя

 Create table task(
     tid BIGINT,
     description VARCHAR(255),
     oid BIGINT,
     PRIMARY KEY(tid), FOREIGN KEY(oid) REFERENCES (user.uid))

3-Должен ли я изменить свой метод сохранения в TaskDAO?

 public Task save(Task task)
 {
    return taskRepository.save(task);
 }

4- Должен ли я изменить свой метод контроллера (метод createTask с помощью RESTcall)

5- Предположим, что все вышеуказанные проблемы устранены. Как я могу получить все задачи, которые есть у пользователя?

6 - Как я могу удалить задачу при удалении пользователя (каскад в SQL, но есть ли какой-либо метод в Hibernate)

Надеюсь, я объяснил свою проблему. Любые отзывы будут оценены.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

1-Что я делаю не так? Я просто хочу добавить задачу с идентификатором владельца в базу данных, однако она возвращает null как ownerid

Прежде всего, я хотел бы убедиться, что владелец сохраняется в БД, просто чтобы быть уверенным, что у вас есть значение для ссылки на

2 - Должен ли я сначала создать таблицу с использованием SQL, используя

Поскольку вы используете ORM, написание SQL-запроса отрицательно скажется на этом, вы можете, но это не все, что необходимо, поскольку отношения уже определены

3-Должен ли я изменить свой метод сохранения в TaskDAO?

4- Должен ли я изменить свой метод контроллера (метод createTask с помощью RESTcall)

Я думаю, что было бы лучше изменить ваш метод createTask, вы можете включить идентификатор пользователя в качестве переменной пути или параметра запроса, и в этом методе вы найдете пользователя, использующего его идентификатор, и зададите поле пользователя в задаче, прежде чем передать его dto, чтобы сохранить значение. Причина, по которой значение oid равно нулю, заключается в том, что у вас нет такого поля.

5- Предположим, что все вышеуказанные проблемы устранены. Как я могу получить все задачи, которые есть у пользователя?

В вашем хранилище задач вы можете создать метод, подобный

Collection<Task> findAllTasksByOwnerId(Long id);

6 - Как я могу удалить задачу при удалении пользователя (каскад в SQL, но есть ли способ в Hibernate)

Вы можете указать тип каскада, в котором вы указали отношения между задачей и пользователем

Вы можете проверить эту ссылку для простого урока о том, как каскадировать весной

0 голосов
/ 10 ноября 2018
The hibernate builds table and foreign keys automatically.Complex queries we can write in repo/controller in hibernate syntax.
With Crud repository we can delete , create update and read data easily.

    for example we have student to course one to many relation.

@OneToMany
@JoinColumn(name = "studentId", referencedColumnName = "studentId", insertable = false, updatable = false)
private List<StudentCourses> studentCourses;

in StudentController I will write

    @CrossOrigin(origins = "http://localhost:8090")
    @RequestMapping(value = "/registerStudentCourse",  method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = 
            MediaType.APPLICATION_JSON_VALUE )
    public StudentCourses registerStudentCourse(@RequestBody StudentCourses studentCourse) {
        if (studentCourse != null) {
            studentCourse.setLastupdated(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));
            studentCourse = studentCourseRepository.save(studentCourse);
        }
        return studentCourse;
    }

    @CrossOrigin(origins = "http://localhost:8090")
    @RequestMapping(value = "/findStudentCourses",  method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = 
            MediaType.APPLICATION_JSON_VALUE )
    public List<StudentCourses> findStudentCourses(@RequestBody String studentId) {
        List<StudentCourses> courses = new ArrayList<>();
        JSONObject requestedJSONObject;
        try {
            requestedJSONObject = new JSONObject(studentId);
            String student = requestedJSONObject.getString("studentId");
            courses = 
 studentCourseRepository.findCoursesByStudent(Long.parseLong(student));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
        }
        return courses;
    }
0 голосов
/ 10 ноября 2018

oid равно нулю, поскольку в Task такого поля нет. Я думаю, что вы смешиваете две концепции здесь. Первый - это объект передачи данных, который представляет вашу структуру данных REST. У этого должно быть поле oid. Второй - это постоянная сущность. Это у вас есть, это Task класс.

Я бы реализовал TaskDTO, использовал сеанс Hibernate, чтобы загрузить User по его идентификатору, затем построить Task из User и другие поля из TaskDTO, а затем сохранить задачу, как вы делаете.

Относительно ваших других вопросов

2 - со значением create или update для hibernate.hbm2ddl.auto Hibernate может генерировать или обновлять таблицы при запуске приложения.

5 - у вас может быть этот интерфейс

@GetMapping("/user/{id}")
public List<TaskDTO> getTasks(@PathVariable Long id)

Тогда я думаю, что вы не можете избежать кодирования какого-либо критерия запроса.

6 - Это делается с помощью настройки отношения с cascade = CascadeType.ALL

...