无法在Hibernate中创建oneToMany关系

时间:2014-09-08 09:53:20

标签: java spring hibernate

我是Hibernate的新手,我正在尝试理解oneToMany概念。我创建了两个实体,分别是Person和Book。一个人可以借很多书,一本书只能有一个人借书。所以我做了以下课程

Person.java

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.GenericGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;



@Entity
@Table(name="PERSON")
public class Person {
    private static final Logger _logger = LoggerFactory.getLogger(Person.class);

    @Id
    @GenericGenerator(name="adder", strategy="increment")
    @GeneratedValue(generator="adder")
    @Column(name="PID")
    private Long id;

    @Column(name="FIRSTNAME")
    private String firstName;

    @Column(name="LASTNAME")
    private String lastName;

    @Column(name="BIRTHDATE")
    @Temporal(TemporalType.DATE)
    private Date birthDate;
    //add genre and books

    @OneToMany(orphanRemoval=true, mappedBy="person", cascade=CascadeType.ALL,targetEntity=Book.class)
    private Set<Book> listOfBooks = new HashSet<Book>();


    public Set<Book> getListOfBooks() {
        return listOfBooks;
    }

    public void setListOfBooks(Set<Book> listOfBooks) {
        this.listOfBooks = listOfBooks;
    }

    public Long getId() {
        return id;
    }

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


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }


    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    //add constructor with all the details



}

Book.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Entity
@Table(name="BOOK")
public class Book {
    private static final Logger logger = LoggerFactory.getLogger(Book.class);

    @Id
    @GenericGenerator(name="adder", strategy="increment")
    @GeneratedValue(generator="adder")
    private Long bookId;

    @Column(name="NAME")
    private String name;

    @Column(name="AUTHOR")
    private String author;

    @Column(name="PUBLICATION_YEAR")
    private int yearOfPublication;

    @Column(name="PUBLISHER")
    private String publisher;

    @ManyToOne()
    @JoinColumn(name="PERSON_ID")
    private Person person;


    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public Long getBookId() {
        return bookId;
    }

    public void setBookId(Long bookId) {
        this.bookId = bookId;
    }


    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 getYearOfPublication() {
        return yearOfPublication;
    }

    public void setYearOfPublication(int yearOfPublication) {
        this.yearOfPublication = yearOfPublication;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }



}

HibernateLibraryDaoMain.java

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import se325.project.assignment1.hibernate.domain.Book;
import se325.project.assignment1.hibernate.domain.Person;

    public class HibernateLibraryDaoMain {

        public static void main(String[] args) {

            Person person = new Person();
            person.setFirstName("Bob");
            person.setLastName("Marley");
            person.setBirthDate(new Date());

            Book book = new Book();
            book.setName("Bob Marley book");
            book.setAuthor("Lily Marley");
            book.setPublisher("Marley Publications");
            book.setYearOfPublication(2000);

            Book book1 = new Book();
            book1.setName("Laura Marley book");
            book1.setAuthor("Laura Marley");
            book1.setPublisher("Laura Publications");
            book1.setYearOfPublication(2005);

            person.getListOfBooks().add(book);
            person.getListOfBooks().add(book1);
            book.setPerson(person);
            book1.setPerson(person);



            Configuration configuration = new Configuration();
            configuration.configure("se325/project/assignment1/hibernate/hibernate.cfg.xml");
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(configuration.getProperties()).build();
            SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

            Session session = sessionFactory.openSession();
            session.beginTransaction();
            session.save(person);
            session.save(book);
            session.save(book1);


            session.getTransaction().commit();
            session.close();
        }

    }

问题是Hibernate没有创建一个单独的表来说明oneToMany关系。我似乎无法找到问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我明白我哪里出错了。当我有一个mappedBy属性集时,Hibernate不会创建第三个表,而是添加到具有ManyToOne和joinColumn属性的Entity。感谢所有帮助过的用户:)