简体   繁体   English

冬眠和春季的复合ID

[英]Composite-id on hibernate and spring

I was trying to implement a composite primary key on Hibernate and Spring. 我试图在Hibernate和Spring上实现复合主键。

Catalog has a catalogId, Book has a composite id (catalogId and bookId) so I've implemented BookId class using @Embeddable annotation. Catalog有一个catalogId,Book有一个复合ID(catalogId和bookId),因此我已经使用@Embeddable注释实现了BookId类。

Catalog.java 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 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 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;
    }

}

Service: 服务:

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

I get the next error: 我收到下一个错误:

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

I have implemented equals() and hashCode() override methods so I can't understand why is the problem. 我已经实现了equals()和hashCode()重写方法,所以我不明白为什么会出问题。 Can you help me? 你能帮助我吗?

Sometimes that Hibernate warning is triggered by other problems in the mappings. 有时,Hibernate警告是由映射中的其他问题触发的。 One problem I see in yours is the Book.catalog mapping. 我在您中看到的一个问题是Book.catalog映射。 You should use a "derived identity" and add a @MapsId annotation: 您应该使用“派生身份”并添加@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