gpt4 book ai didi

java - 在 spring boot JPA 中,如何正确地将实体表示具有外键关联的对象发布到不同的实体?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:35 25 4
gpt4 key购买 nike

如果我有一个实体包含另一个类的对象,例如 Book内部有一个 Publisher 的实体关联的实体如下:

@ManyToOne
@JoinColumn(name="PUB_CODE", referencedColumnName = "PUB_CODE")
private Publisher pub;

这是一种安全/正确的方法(我在这个例子中看到了数据库中的正确数据,但不能 100% 确定它是否适用于所有情况)方法来发布在数据库中具有外键关联的对象?我不知道这样做在事务原子性或线程方面是否安全,或者它是否有效。相关代码如下:

Book.java

package app.domain;

/*imports*/

@Entity
public class Book implements Serializable{

/**
*
*/
private static final long serialVersionUID = -6902184723423514234L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(nullable = false, unique=true)
private String bookName;

@Column(nullable = false)
private int pageCount;

@ManyToOne
@JoinColumn(name="PUB_CODE", referencedColumnName="PUB_CODE")
private Publisher pub;


/*public getters and setters*/

}

Publisher.java

package app.domain;

/*imports*/

@Entity
public class Publisher implements Serializable {

private static final long serialVersionUID = 4750079787174869458L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name="PUB_CODE",nullable = false, unique = true)
private String publisherCode;

@Column(nullable = false)
private String publisherName;

/*public getters and setters*/

}

BookRepo.java

package app.service;

/*imports*/

public interface BookRepo extends JpaRepository<Book, Long>{

@Query("SELECT pb FROM Publisher pb WHERE pb.publisherCode = TRIM(UPPER(:pubCode))")
public Publisher findPublisherByPubCode(@Param("pubCode")String pubCode);
}

BookController.java

package app.controller;

/*imports*/

@RestController
@RequestMapping(value = "/books")
public class BookController {

private BookRepo bookRepo;

@Autowired
public BookController(BookRepo bookRepo) {
this.bookRepo = bookRepo;
}
//The ApiPathParam is for JSONDOC purposes
@RequestMapping(value = "/create", method = RequestMethod.POST)
public List<Book> create(@ApiPathParam(name = "book") @RequestBody Book book, @ApiPathParam(name = "pubCode") @RequestParam("pubCode") String pubCode) {
// Assume exception handling
Publisher pbToAttachToThisBook = bookRepo.findPublisherByPubCode(pubCode);
book.setPub(pbToAttachToThisBook);
bookRepo.save(book);
return bookRepo.findAll();
}
}

发布对象主体(输入到 POST 工具):

{
"bookName": "goosebumps",
"id": 0,
"pageCount": 332,
"pub": {
"id": 0,
"publisherCode": "",
"publisherName": "",
"serialVersionUID": 0
},
"serialVersionUID": 0
}

提供的 pubCode 参数输入,也进入 POST 工具,在与上述相同的调用中:'SC'

上述代码执行后,在Book 表中,有一个条目为上面的书,它的PUB_CODE外键栏填写'SC' , 以及返回的 List<Book>调用的 POST Controller 方法显示新添加的书包括 Publisher PUB_CODE='SC' 的出版商的实体信息(例如全名“Scholastic”)已经存在于数据库中。

谢谢。

最佳答案

您最初发布的技术(传递 FK ID,在您的 Controller 中手动检索它,并在实体上明确设置)是有效且安全的。

我不知道有什么更简洁的方法,除非您转向 HATEOAS 主体,它允许资源链接处理:http://projects.spring.io/spring-hateoas/

关于java - 在 spring boot JPA 中,如何正确地将实体表示具有外键关联的对象发布到不同的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41772855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com