簡體   English   中英

冬眠和春季的復合ID

[英]Composite-id on hibernate and spring

我試圖在Hibernate和Spring上實現復合主鍵。

Catalog有一個catalogId,Book有一個復合ID(catalogId和bookId),因此我已經使用@Embeddable注釋實現了BookId類。

Catalog.java

@Entity
@Table(name = "catalog")
public class Catalog {

    private Integer id;
    private Timestamp date;


    private List<Book> books = new ArrayList<>();

    public Catalog() {
    }


    public Catalog(Timestamp date) {
        this.date = date;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

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

    @Column(name = "date")
    public Timestamp getDate() {
        return date;
    }

    public void setDate(Timestamp date) {
        this.date = date;
    }



    @OneToMany(mappedBy="catalog")
    public List<Book> getBooks() {
        return books;
    }

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

}

BookId.java

@Embeddable
public class BookId implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "id_catalog")
    private Integer idCatalog;

    @Column(name = "id_book")
    private Integer idBook;

    public BookId() {
    }

    public BookId(Integer idCatalog, Integer idBook) {
        this.idCatalog = idCatalog;
        this.idBook = idBook;
    }

    public Integer getIdCatalog() {
        return idCatalog;
    }

    public void setIdCatalog(Integer idCatalog) {
        this.idCatalog = idCatalog;
    }

    public Integer getIdBook() {
        return idBook;
    }

    public void setIdBook(Integer idBook) {
        this.idBook = idBook;
    }


    @Override
    public int hashCode() {
        return Objects.hash(getIdCatalog(), getIdBook());
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof BookId)) return false;
        BookId that = (BookId) o;
        return Objects.equals(getIdCatalog(), that.getIdCatalog()) &&
                Objects.equals(getIdBook(), that.getIdBook());

    }

}

Book.java

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


    private BookId idBook;

    private Integer pages;
    private String title;

    private Catalog catalog;

    public Book(Integer pages, Catalog catalog) {
        this.pages = pages;
        this.catalog = catalog;
    }

    public Book() {
    }

    @EmbeddedId
    public BookId getIdBook() {
        return idBook;
    }

    public void setIdBook(BookId idBook) {
        this.idBook = idBook;
    }


    @Column(name = "pages")
    public Integer getPages() {
        return pages;
    }

    public void setPages(Integer pages) {
        this.pages = pages;
    }

    @Column(name = "title")
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }


    @ManyToOne
    @JoinColumn(name="id_catalog")
    public Catalog getCatalog() {
        return catalog;
    }

    public void setCatalog(Catalog catalog) {
        this.catalog = catalog;
    }

}

服務:

@Transactional
    public void addCatalog(Catalog catalog, List<Book> books) {
        catalogDao.insert(catalog);

        for(int i=0; i<books.size(); i++) {
            BookId bid = new BookId();
            bid.setIdBook(i+1);
            bid.setIdCatalog(catalog.getId());          

            Book b = new Book();
            b.setIdBook(bid);

            b.setPages(books.get(i).getPages());
            b.setTitle(books.get(i).getTitle());
            b.setCatalog(catalog);

            catalog.getBooks().add(b);

            bookDao.insert(b);
        }
    }

我收到下一個錯誤:

oct 06, 2018 9:27:59 PM org.hibernate.mapping.RootClass checkCompositeIdentifier
WARN: HHH000038: Composite-id class does not override equals(): com.myapp.BookId
oct 06, 2018 9:27:59 PM org.hibernate.mapping.RootClass checkCompositeIdentifier
WARN: HHH000039: Composite-id class does not override hashCode(): com.myapp.BookId

我已經實現了equals()和hashCode()重寫方法,所以我不明白為什么會出問題。 你能幫助我嗎?

有時,Hibernate警告是由映射中的其他問題觸發的。 我在您中看到的一個問題是Book.catalog映射。 您應該使用“派生身份”並添加@MapsId批注:

    @ManyToOne
    @MapsId("idCatalog") // maps idCatalog attribute of embedded id
    @JoinColumn(name="id_catalog")
    public Catalog getCatalog() {
        return catalog;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM