Hibernate使用REST添加具有外键的实体

时间:2018-11-10 08:27:58

标签: java hibernate rest postman dao

首先,我没有编写任何SQL语句来创建表。我尝试仅在不编写SQL的情况下使用Hibernate / jpa。

我的关系如下:一个用户可以有多个任务,一个任务只有一个用户。

我是这样创建模型的:

用户表:

@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;
    }
...
}

关系是任务的ownerid(oid)是用户的uid。

要将用户保存到我的数据库,我使用具有以下参数的邮递员:

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

要将任务保存到我的数据库中,我正在使用以下代码:

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

但是,当我执行保存任务时,任务的oid为NULL。在数据访问对象中,我具有:

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

1-我在做什么错?我只想将具有所有者ID的任务添加到数据库,但是它会返回null作为所有者ID。

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-我应该更改控制器方法(使用RESTcall的createTask方法)

5-假设以上所有问题均已解决。如何获取用户的所有任务?

6-删除用户后如何删除任务(SQL中为小写,但Hibernate中有任何方法)

我希望我能解释我的问题。任何反馈将不胜感激。

3 个答案:

答案 0 :(得分:0)

oid为空,因为Task中没有这样的字段。我认为您在这里混入两个概念。第一个是代表您的REST数据结构的数据传输对象。这个应该有一个oid字段。第二个是持久实体。您拥有的这是Task类。

我将实现TaskDTO,使用Hibernate的会话通过其ID加载User,然后从Task构建User,并从TaskDTO构建其他字段,然后像您一样保存任务。

关于其他问题

2-使用create的{​​{1}}或update值,Hibernate可以在启动应用程序时生成或更新表。

5-您可以拥有此界面

hibernate.hbm2ddl.auto

然后,我认为您无法逃避编写某种标准查询的代码。

6-通过使用@GetMapping("/user/{id}") public List<TaskDTO> getTasks(@PathVariable Long id)

配置关系来完成

答案 1 :(得分:0)

  

1-我在做什么错?我只想将具有所有者ID的任务添加到数据库,但是它会返回null作为所有者ID

首先,我将确保所有者保留在数据库中,只是为了确保您具有要引用的值

  

2-我应该首先使用SQL创建表吗

由于您使用的是ORM,因此编写SQL查询可能会达到目的,但您不必这样做,因为已经指定了关系

  

3-是否应该在TaskDAO中更改保存方法?

     

4-我应该更改控制器方法(使用RESTcall的createTask方法)

我认为最好更改您的createTask方法,您可以将用户ID包含为pathvariable或queryparameter,在该方法中,您可以使用其ID查找用户并在任务中设置用户字段,然后再将其传递给dto保存值。 oid为null的原因是因为那里没有这样的字段。

  

5-假设以上所有问题均已解决。如何获取用户的所有任务?

在任务存储库中,您可以创建类似的方法

Collection<Task> findAllTasksByOwnerId(Long id);
  

6-删除用户后如何删除任务(SQL中为小写,但Hibernate中有任何方法)

您可以在指定任务和用户之间的关系的地方指定级联类型

You can check this link for a simple tutorial on how to cascade in spring

答案 2 :(得分:0)

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