| ||||||||||||||||||||
Resin 3.1 Documentation Examples Changes Quercus Database Amber EJB SOA/ESB IoC JMS Servlet JMX Hessian Security Field Property Create Query Many-to-One One-to-Many Many-to-Many Inherit Sessions |
The @OneToMany relation adds collection extensions to the query language and provides a Java Collection containing the children. @OneToMany represents a collection of children belonging to a parent, like students in Gryffindor house at Hogwarts school. The Many-To-One tutorial illustrated that a many-to-one relation links one source entity to another target entity. A one-to-many relation links the target entity back to the source entity. In this example, each House has many Students, each Student has one House. House has a one-to-many relationship with Student, Student has a many-to-one relationship with House Files in this tutorial
Data Model: Object and Database ModelsDatabase SchemaThe database schema is unchanged from the Many-To-One tutorial, and might look like: CREATE TABLE house ( id BIGINT PRIMARY KEY auto_increment, name VARCHAR(250), ) CREATE TABLE student ( id BIGINT PRIMARY KEY auto_increment, name VARCHAR(250), house BIGINT REFERENCES house(id) ) @OneToMany - the relation's "inverse" sideThe @OneToMany(mappedBy="house") private Set<Student> _students; @ManyToOne - the relation's "owning" side
A @OneToMany always requires a corresponding @ManyToOne on the target entity.
The Student has a house field annotated a @ManyToOne @JoinColumn(name="house") private House _house; java.util.Collection: Using House.getStudents()The one-to-many relation provides a House the ability to get all of its Students. Resin will perform any necessary database lookup. The example queries all houses and prints their names and all of their students. private void doService(PrintWriter out) throws java.io.IOException { public void service(HttpServletRequest req, HttpServletResponse res) throws java.io.IOException, ServletException { PrintWriter out = res.getWriter(); res.setContentType("text/html"); String sql = "SELECT h FROM House h"; Query allHouse = _entityManager.createQuery("SELECT o FROM House o"); List houses = allHouse.getResultList(); for (int i = 0; i < houses.size(); i++) { House house = (House) houses.get(i); out.println("<h3>" + house.getName() + "</h3>"); for ( Student student : house.getStudents() ) { out.println( student.getName() + "<br>" ); } } } } Query extensionsResult Collections: SELECT h.studentsSELECT h.students FROM House h WHERE h.name='Gryffindor' Joins: FROM House h, IN(h.students) sSELECT s FROM House h, IN(h.students) s WHERE h.name='Gryffindor' Membership: s MEMBER OF h.studentsSELECT s FROM Student s, House h WHERE s MEMBER OF h.students Empty: h.students IS EMPTYSELECT h FROM House h WHERE h.students IS EMPTY
|