首先,我没有编写任何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中有任何方法)
我希望我能解释我的问题。任何反馈将不胜感激。
答案 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;
}