使用@ManyToOne关联时,分离的实体传递给持久性错误

时间:2016-07-13 11:25:47

标签: spring hibernate

我有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

3 个答案:

答案 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)

公共无效运行之前的@Transactional()为我工作...非常感谢@Youssef和@Chathuranga Tennakoon的努力。为他人分享代码。

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