JustCoding
JustCoding

Reputation: 11

How can I fill two entities with data after i click submit

I am looking for a solution all day, but I still can not find anything.

When I create a book, how can I create an author and assign it to a book at the same time?

I have two entities

Book

@Data
@Entity
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;

@ManyToOne
private Author author;
}

Author

@Data
@Entity
public class Author {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;

@OneToMany(mappedBy = "author")
private Set<Book> books;
}

Controller

@Controller
public class BookController {

private BookRepository bookRepository;

public BookController(BookRepository bookRepository) {
    this.bookRepository = bookRepository;
}

@RequestMapping(value="/booklist", method= RequestMethod.GET)
public String bookList(Model model) {
    model.addAttribute("books", bookRepository.findAll());
    return "booklist";
}

@RequestMapping(value = "/add")
public String addBook(Model model){
    model.addAttribute("book", new Book());
    return "addbook";
}

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(Book book){
    bookRepository.save(book);        
    return "redirect:booklist";
}
}

VIEW

<body>

<div>
    <form th:object="${book}" th:action="@{save}" action="#" method="post">
        <label for="title">Title</label> 
        <input type="text" id="title"
            th:field="*{title}" />
        <label for="author">Author</label>
        <input type="text" id="author" th:field="*{author.name}" />

        <input type="submit" value="Save"></input>
    </form>
</div>


</body>

When I try to create a book I got this error
There was an unexpected error (type=Internal Server Error, status=500). org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

After i click submit button it should look like this

Upvotes: 0

Views: 63

Answers (1)

Oğuzhan Ayg&#252;n
Oğuzhan Ayg&#252;n

Reputation: 137

Try adding cascede to Author in entity like this

@Data
@Entity
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;

@ManyToOne(cascade=CascadeType.ALL)
private Author author;

}

or use prepersist annotation on your entity

@PrePersist
protected void onCreate() {
    //check author is exist if not persist the author first
}

Upvotes: 1

Related Questions