我有Bookdetail
& BookDetail
类
当我尝试使用Book
为我的两个@ManyToOne
对象使用相同的JpaRepository
信息时,我正在
"分离的实体传递给持久性错误"。
我尝试使用CrudRepository
和@SpringBootApplication
public class HelloJpaApplication implements CommandLineRunner{
private static final Logger logger = LoggerFactory.getLogger(HelloJpaApplication.class);
@Autowired
private BookRepository bookRepository;
public void run(String... arg0) throws Exception {
Book book1=new Book();
book1.setName("my thoughts");
Book book2=new Book();
book2.setName("your thoughts");
Bookdetail detail=new Bookdetail();
detail.setCategory("good books");
book1.setBookdetail(detail);
book2.setBookdetail(detail);
bookRepository.save(book1);
bookRepository.save(book2);
}
public static void main(String[] args) {
SpringApplication.run(HelloJpaApplication.class, args);
}
}
。但结果相同
请帮帮我。提前致谢
主要类
public interface BookRepository extends JpaRepository<Book,Integer>{
}
BookRepository界面
@Entity
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int bookid;
private String name;
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
private Bookdetail bookdetail;
public Book() {
}
public Book(String name) {
this.name=name;
}
public int getBookid() {
return bookid;
}
public void setBookid(int bookid) {
this.bookid = bookid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bookdetail getBookdetail() {
return bookdetail;
}
public void setBookdetail(Bookdetail bookdetail) {
this.bookdetail = bookdetail;
}
}
预订课程
@Entity
@Table(name="bookdetail")
public class Bookdetail {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int bookid;
private String category;
public Bookdetail() {
}
public Bookdetail(String category) {
this.category=category;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
Bookdetail Class
MainActivity.java
答案 0 :(得分:1)
使用/help $1-
创建的每个对象都是一个分离的实体,这意味着他不在休眠会话中,或者没有标识符Bookdetail detail=new Bookdetail();
。
并且您必须将保留或更新或删除的服务包装到交易。
首先,您必须保存id
已分离的实体:detail
将其附加到会话但是,在您已指定bookdetailRepository.save(detail)
cascade = {CascadeType.PERSIST,CascadeType.MERGE}
之前无需保存,作业将自动完成。
然后解决方案是使用@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
private Bookdetail bookdetail;
run()
@Transactional
答案 1 :(得分:1)
@SpringBootApplication
// @EnableJpaRepositories(basePackages = {"com.jpa.repository"})
public class HelloJpaApplication implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(HelloJpaApplication.class);
@Autowired
private BookRepository bookRepository;
// @Autowired
// private BookDetailRepository bookDetailRepository;
@Transactional
public void run(String... arg0) throws Exception {
Book book1 = new Book();
book1.setName("my thoughts");
Book book2 = new Book();
book2.setName("your thoughts");
Bookdetail detail = new Bookdetail();
detail.setCategory("good books");
// bookDetailRepository.save(detail);
book1.setBookdetail(detail);
book2.setBookdetail(detail);
bookRepository.save(book1);
bookRepository.save(book2);
}
public static void main(String[] args) {
SpringApplication.run(HelloJpaApplication.class, args);
}
}
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int bookid;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
private Bookdetail bookdetail;
public Book() {
}
public Book(String name) {
this.name = name;
}
public int getBookid() {
return bookid;
}
public void setBookid(int bookid) {
this.bookid = bookid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bookdetail getBookdetail() {
return bookdetail;
}
public void setBookdetail(Bookdetail bookdetail) {
this.bookdetail = bookdetail;
}
}
@Entity
@Table(name = "bookdetail")
public class Bookdetail {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int bookid;
private String category;
public Bookdetail() {
}
public Bookdetail(String category) {
this.category = category;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
@Repository
public interface BookRepository extends JpaRepository<Book,Integer>{
}
答案 2 :(得分:0)
按如下方式添加BookdetailRepository。
@Repository
public interface BookdetailRepository extends JpaRepository<Bookdetail,Integer> {
}
并按如下方式更改HelloJpaApplication。
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.jpa"})
public class HelloJpaApplication implements CommandLineRunner{
private static final Logger logger = LoggerFactory.getLogger(HelloJpaApplication.class);
@Autowired
private BookRepository bookRepository;
@Autowired
BookdetailRepository bookdetailRepository;
public void run(String... arg0) throws Exception {
Book book1=new Book();
book1.setName("my thoughts");
Book book2=new Book();
book2.setName("your thoughts");
Bookdetail detail=new Bookdetail();
detail.setCategory("good books");
bookdetailRepository.save(detail); //saving the bookDetail
book1.setBookdetail(detail);
book2.setBookdetail(detail);
bookRepository.save(book1);
bookRepository.save(book2);
}
public static void main(String[] args) {
SpringApplication.run(HelloJpaApplication.class, args);
}
}