简体   繁体   中英

How to save with default value using Spring JPA?

Recently I switched into Spring Data JPA and I am wondering how is it possible to save a new object into the database with some default values.

In my example I have to save a book into my database, but, in the owner column, I need to put the value 0. So, this how I did that with JDBC, and it works amazingly well.

   public void save(Book book){
        jdbcTemplate.update("INSERT INTO book(name,author,yearOfProduction,owner) VALUES (?, ?, ?, 0)",
                book.getName(),book.getAuthor(),book.getYearOfProduction());
    }

Now I want to do the same with Spring Data JPA. Here is my save function:

BookService

    @Transactional
    public void save(Book book)
    {
        bookRepository.save(book);
    }

I have two objects: Person and Book. The relationships are: one person can have many books and one book has one owner. Here are my Person and Book classes:

Book

@Entity
@Table(name = "book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id",nullable = false)
    private int id;
    @Column(name="name")
    @NotEmpty(message = "Book name can't bee empty")
    private String name;
    @Column(name="author")
    @NotEmpty(message = "Author name can't bee empty")
    private String author;
    @Column(name="yearOfProduction")
    @NotNull(message = "Year of production can't bee empty")
    @Min(value = 0,message = "year must be more than 1900")
    private int yearOfProduction;

    @ManyToOne
    @JoinColumn(name = "owner_id", referencedColumnName = "id")
    private Person owner;

    public Book(String name, String author, int yearOfProduction) {
        this.name = name;
        this.author = author;
        this.yearOfProduction = yearOfProduction;
    }
    public Book(){

    }

    public Person getOwner() {
        return owner;
    }

    public void setOwner(Person owner) {
        this.owner = owner;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getYearOfProduction() {
        return yearOfProduction;
    }

    public void setYearOfProduction(int yearOfProduction) {
        this.yearOfProduction = yearOfProduction;
    }
}

Person|

@Entity
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;
    @Column(name = "name")
    @NotEmpty(message = "Please enter the name")
    @Size(min = 1, max = 30, message = "Length must be 2-30 symbols")
    //make regex with ФИО;
    private String name;
    @Column(name = "ageOfBirth")
    @Min(value = 0, message = "age of birth must be more than 0")
    private int ageOfBirth;

    @OneToMany(mappedBy = "owner")
    private List<Book> books;


    public Person() {

    }
    public Person(String name, int ageOfBirth) {
        this.name = name;
        this.ageOfBirth = ageOfBirth;
    }

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAgeOfBirth() {
        return ageOfBirth;
    }

    public void setAgeOfBirth(int ageOfBirth) {
        this.ageOfBirth = ageOfBirth;
    }
}

I guess this is impossible to make with Spring Data JPA? So, I made it with by adding JdbcTemplate and I definitely think it is a hard-coding approach to use Spring DATA and JdbcTemplate together.

It's also unable to make with database. Down below i am using the default definition of postgres and still get null's when create a new book. https://www.baeldung.com/jpa-default-column-values

create table book(
                     id int primary key generated by default as identity,
                     name varchar(250) not null,
                     author varchar(250) not null,
                     yearOfProduction int not null,
                     owner_id int default 0 references person(id)
)

@egeorge answered my question. It is impossible to input 0 into owner table.

Since 0 has a special value, and is not a real person record, there should not be any value in that field. null is the appropriate value for a join column that is not joined to an actual record. You will need to change the logic that interprets 0 as "free" to check for null instead. (I am surprised your database let you do that to begin with. Foreign key constraints will normally reject a value that is not present in the referred table.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM