<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FJPA%2FSelf_Join</id>
		<title>Java/JPA/Self Join - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FJPA%2FSelf_Join"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/JPA/Self_Join&amp;action=history"/>
		<updated>2026-04-07T11:05:20Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/JPA/Self_Join&amp;diff=8981&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/JPA/Self_Join&amp;diff=8981&amp;oldid=prev"/>
				<updated>2010-06-01T07:22:56Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:22, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/JPA/Self_Join&amp;diff=8980&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/JPA/Self_Join&amp;diff=8980&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:48Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Join Member Entities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File: Professor.java&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import javax.persistence.Entity;&lt;br /&gt;
import javax.persistence.Id;&lt;br /&gt;
import javax.persistence.ManyToMany;&lt;br /&gt;
import javax.persistence.ManyToOne;&lt;br /&gt;
import javax.persistence.NamedQueries;&lt;br /&gt;
import javax.persistence.NamedQuery;&lt;br /&gt;
import javax.persistence.OneToMany;&lt;br /&gt;
import javax.persistence.Temporal;&lt;br /&gt;
import javax.persistence.TemporalType;&lt;br /&gt;
@Entity&lt;br /&gt;
public class Professor {&lt;br /&gt;
    @Id&lt;br /&gt;
    private int id;&lt;br /&gt;
    private String name;&lt;br /&gt;
    private long salary;&lt;br /&gt;
    @Temporal(TemporalType.DATE)&lt;br /&gt;
    private Date startDate;&lt;br /&gt;
    &lt;br /&gt;
    @ManyToOne&lt;br /&gt;
    private Professor manager;&lt;br /&gt;
    &lt;br /&gt;
    @OneToMany(mappedBy=&amp;quot;manager&amp;quot;)&lt;br /&gt;
    private Collection&amp;lt;Professor&amp;gt; directs;&lt;br /&gt;
    @ManyToOne&lt;br /&gt;
    private Department department;&lt;br /&gt;
    &lt;br /&gt;
    @ManyToMany &lt;br /&gt;
    private Collection&amp;lt;Project&amp;gt; projects;&lt;br /&gt;
    public Professor() {&lt;br /&gt;
        projects = new ArrayList&amp;lt;Project&amp;gt;();&lt;br /&gt;
        directs = new ArrayList&amp;lt;Professor&amp;gt;();&lt;br /&gt;
    }&lt;br /&gt;
    public int getId() {&lt;br /&gt;
        return id;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return name;&lt;br /&gt;
    }&lt;br /&gt;
    public long getSalary() {&lt;br /&gt;
        return salary;&lt;br /&gt;
    }&lt;br /&gt;
    public Date getStartDate() {&lt;br /&gt;
        return startDate;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Department getDepartment() {&lt;br /&gt;
        return department;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Collection&amp;lt;Professor&amp;gt; getDirects() {&lt;br /&gt;
        return directs;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Professor getManager() {&lt;br /&gt;
        return manager;&lt;br /&gt;
    }&lt;br /&gt;
    public Collection&amp;lt;Project&amp;gt; getProjects() {&lt;br /&gt;
        return projects;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;Professor &amp;quot; + getId() + &lt;br /&gt;
               &amp;quot;: name: &amp;quot; + getName() +&lt;br /&gt;
               &amp;quot;, salary: &amp;quot; + getSalary() +&lt;br /&gt;
               &amp;quot;, dept: &amp;quot; + ((getDepartment() == null) ? null : getDepartment().getName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File: ProfessorService.java&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import javax.persistence.EntityManager;&lt;br /&gt;
import javax.persistence.Query;&lt;br /&gt;
public class ProfessorService {&lt;br /&gt;
  protected EntityManager em;&lt;br /&gt;
  public ProfessorService(EntityManager em) {&lt;br /&gt;
    this.em = em;&lt;br /&gt;
  }&lt;br /&gt;
  Query unassignedQuery;&lt;br /&gt;
  &lt;br /&gt;
  public List findProjectProfessors(String projectName) {&lt;br /&gt;
    return em.createQuery(&amp;quot;SELECT e &amp;quot; +&lt;br /&gt;
                          &amp;quot;FROM Project p JOIN p.employees e &amp;quot; +&lt;br /&gt;
                          &amp;quot;WHERE p.name = :project &amp;quot; +&lt;br /&gt;
                          &amp;quot;ORDER BY e.name&amp;quot;)&lt;br /&gt;
             .setParameter(&amp;quot;project&amp;quot;, projectName)&lt;br /&gt;
             .getResultList();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File: Project.java&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import javax.persistence.Entity;&lt;br /&gt;
import javax.persistence.Id;&lt;br /&gt;
import javax.persistence.ManyToMany;&lt;br /&gt;
@Entity&lt;br /&gt;
public class Project {&lt;br /&gt;
    @Id&lt;br /&gt;
    protected int id;&lt;br /&gt;
    protected String name;&lt;br /&gt;
    @ManyToMany(mappedBy=&amp;quot;projects&amp;quot;)&lt;br /&gt;
    private Collection&amp;lt;Professor&amp;gt; employees;&lt;br /&gt;
    public Project() {&lt;br /&gt;
        employees = new ArrayList&amp;lt;Professor&amp;gt;();&lt;br /&gt;
    }&lt;br /&gt;
    public int getId() {&lt;br /&gt;
        return id;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return name;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Collection&amp;lt;Professor&amp;gt; getProfessors() {&lt;br /&gt;
        return employees;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;Project id: &amp;quot; + getId() + &amp;quot;, name: &amp;quot; + getName();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File: Department.java&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import javax.persistence.Entity;&lt;br /&gt;
import javax.persistence.Id;&lt;br /&gt;
import javax.persistence.OneToMany;&lt;br /&gt;
@Entity&lt;br /&gt;
public class Department {&lt;br /&gt;
    @Id&lt;br /&gt;
    private int id;&lt;br /&gt;
    private String name;&lt;br /&gt;
    @OneToMany(mappedBy=&amp;quot;department&amp;quot;)&lt;br /&gt;
    private Collection&amp;lt;Professor&amp;gt; employees;&lt;br /&gt;
    public Department() {&lt;br /&gt;
        employees = new ArrayList&amp;lt;Professor&amp;gt;();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public int getId() {&lt;br /&gt;
        return id;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return name;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Collection&amp;lt;Professor&amp;gt; getProfessors() {&lt;br /&gt;
        return employees;&lt;br /&gt;
    }&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;Department no: &amp;quot; + getId() + &lt;br /&gt;
               &amp;quot;, name: &amp;quot; + getName();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File: JPAUtil.java&lt;br /&gt;
import java.io.Reader;&lt;br /&gt;
import java.sql.Connection;&lt;br /&gt;
import java.sql.DriverManager;&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
import java.sql.ResultSetMetaData;&lt;br /&gt;
import java.sql.Statement;&lt;br /&gt;
public class JPAUtil {&lt;br /&gt;
  Statement st;&lt;br /&gt;
  &lt;br /&gt;
  public JPAUtil() throws Exception{&lt;br /&gt;
    Class.forName(&amp;quot;org.hsqldb.jdbcDriver&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Driver Loaded.&amp;quot;);&lt;br /&gt;
    String url = &amp;quot;jdbc:hsqldb:data/tutorial&amp;quot;;&lt;br /&gt;
    Connection conn = DriverManager.getConnection(url, &amp;quot;sa&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Got Connection.&amp;quot;);&lt;br /&gt;
    st = conn.createStatement();&lt;br /&gt;
  }&lt;br /&gt;
  public void executeSQLCommand(String sql) throws Exception {&lt;br /&gt;
    st.executeUpdate(sql);&lt;br /&gt;
  }&lt;br /&gt;
  public void checkData(String sql) throws Exception {&lt;br /&gt;
    ResultSet rs = st.executeQuery(sql);&lt;br /&gt;
    ResultSetMetaData metadata = rs.getMetaData();&lt;br /&gt;
    for (int i = 0; i &amp;lt; metadata.getColumnCount(); i++) {&lt;br /&gt;
      System.out.print(&amp;quot;\t&amp;quot;+ metadata.getColumnLabel(i + 1)); &lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;\n----------------------------------&amp;quot;);&lt;br /&gt;
    while (rs.next()) {&lt;br /&gt;
      for (int i = 0; i &amp;lt; metadata.getColumnCount(); i++) {&lt;br /&gt;
        Object value = rs.getObject(i + 1);&lt;br /&gt;
        if (value == null) {&lt;br /&gt;
          System.out.print(&amp;quot;\t       &amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
          System.out.print(&amp;quot;\t&amp;quot;+value.toString().trim());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      System.out.println(&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File: Main.java&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import javax.persistence.EntityManager;&lt;br /&gt;
import javax.persistence.EntityManagerFactory;&lt;br /&gt;
import javax.persistence.Persistence;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] a) throws Exception {&lt;br /&gt;
    JPAUtil util = new JPAUtil();&lt;br /&gt;
    EntityManagerFactory emf = Persistence.createEntityManagerFactory(&amp;quot;ProfessorService&amp;quot;);&lt;br /&gt;
    EntityManager em = emf.createEntityManager();&lt;br /&gt;
    ProfessorService service = new ProfessorService(em);&lt;br /&gt;
    em.getTransaction().begin();&lt;br /&gt;
    service.findProjectProfessors(&amp;quot;projName&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
    util.checkData(&amp;quot;select * from Professor&amp;quot;);&lt;br /&gt;
    util.checkData(&amp;quot;select * from Department&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    em.getTransaction().rumit();&lt;br /&gt;
    em.close();&lt;br /&gt;
    emf.close();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
File: persistence.xml&lt;br /&gt;
&amp;lt;persistence xmlns=&amp;quot;http://java.sun.ru/xml/ns/persistence&amp;quot;&lt;br /&gt;
             xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
             xsi:schemaLocation=&amp;quot;http://java.sun.ru/xml/ns/persistence http://java.sun.ru/xml/ns/persistence/persistence&amp;quot; version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;persistence-unit name=&amp;quot;JPAService&amp;quot; transaction-type=&amp;quot;RESOURCE_LOCAL&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;properties&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;hibernate.dialect&amp;quot; value=&amp;quot;org.hibernate.dialect.HSQLDialect&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;hibernate.hbm2ddl.auto&amp;quot; value=&amp;quot;update&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;hibernate.connection.driver_class&amp;quot; value=&amp;quot;org.hsqldb.jdbcDriver&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;hibernate.connection.username&amp;quot; value=&amp;quot;sa&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;hibernate.connection.password&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;property name=&amp;quot;hibernate.connection.url&amp;quot; value=&amp;quot;jdbc:hsqldb:data/tutorial&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/properties&amp;gt;&lt;br /&gt;
  &amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;
&amp;lt;/persistence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Relations on one entity ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Licensed to the Apache Software Foundation (ASF) under one&lt;br /&gt;
 * or more contributor license agreements.  See the NOTICE file&lt;br /&gt;
 * distributed with this work for additional information&lt;br /&gt;
 * regarding copyright ownership.  The ASF licenses this file&lt;br /&gt;
 * to you under the Apache License, Version 2.0 (the&lt;br /&gt;
 * &amp;quot;License&amp;quot;); you may not use this file except in compliance&lt;br /&gt;
 * with the License.  You may obtain a copy of the License at&lt;br /&gt;
 *&lt;br /&gt;
 * http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 *&lt;br /&gt;
 * Unless required by applicable law or agreed to in writing,&lt;br /&gt;
 * software distributed under the License is distributed on an&lt;br /&gt;
 * &amp;quot;AS IS&amp;quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY&lt;br /&gt;
 * KIND, either express or implied.  See the License for the&lt;br /&gt;
 * specific language governing permissions and limitations&lt;br /&gt;
 * under the License.    &lt;br /&gt;
 */&lt;br /&gt;
package relations;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import javax.persistence.*;&lt;br /&gt;
// import the enums for MALE and FEMALE&lt;br /&gt;
import static relations.Deity.Gender.*;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * A very simple, stand-alone program that stores a new entity in the&lt;br /&gt;
 * database and then performs a query to retrieve it.&lt;br /&gt;
 */&lt;br /&gt;
public class Main {&lt;br /&gt;
    @SuppressWarnings(&amp;quot;unchecked&amp;quot;)&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // Create a new EntityManagerFactory using the System properties.&lt;br /&gt;
        // The &amp;quot;relations&amp;quot; name will be used to configure based on the&lt;br /&gt;
        // corresponding name in the META-INF/persistence.xml file&lt;br /&gt;
        EntityManagerFactory factory = Persistence.&lt;br /&gt;
            createEntityManagerFactory(&amp;quot;relations&amp;quot;, System.getProperties());&lt;br /&gt;
        // Create a new EntityManager from the EntityManagerFactory. The&lt;br /&gt;
        // EntityManager is the main object in the persistence API, and is&lt;br /&gt;
        // used to create, delete, and query objects, as well as access&lt;br /&gt;
        // the current transaction&lt;br /&gt;
        EntityManager em = factory.createEntityManager();&lt;br /&gt;
        initFamilyTree(em);&lt;br /&gt;
        runQueries(em);&lt;br /&gt;
        // It is always good to clean up after ourselves&lt;br /&gt;
        em.close();&lt;br /&gt;
        factory.close();&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Creates a partial family tree of the Greek dieties.&lt;br /&gt;
     *  &lt;br /&gt;
     * @param  em  the EntityManager to use in the persistence process&lt;br /&gt;
     */&lt;br /&gt;
    public static void initFamilyTree(EntityManager em) {&lt;br /&gt;
        // First delete all the members from the database the clean up&lt;br /&gt;
        em.getTransaction().begin();&lt;br /&gt;
        em.createQuery(&amp;quot;delete from Deity&amp;quot;).executeUpdate();&lt;br /&gt;
        em.getTransaction().rumit();&lt;br /&gt;
        // Generation 1&lt;br /&gt;
        Deity uranus = new Deity(&amp;quot;Uranus&amp;quot;, MALE);&lt;br /&gt;
        Deity gaea = new Deity(&amp;quot;Gaea&amp;quot;, FEMALE);&lt;br /&gt;
        // Generation 2&lt;br /&gt;
        Deity cronus = gaea.giveBirth(&amp;quot;Cronus&amp;quot;, uranus, MALE);&lt;br /&gt;
        Deity rhea = gaea.giveBirth(&amp;quot;Rhea&amp;quot;, uranus, FEMALE);&lt;br /&gt;
        Deity coeus = gaea.giveBirth(&amp;quot;Coeus&amp;quot;, uranus, MALE);&lt;br /&gt;
        Deity phoebe  = gaea.giveBirth(&amp;quot;Phoebe&amp;quot;, uranus, FEMALE);&lt;br /&gt;
        Deity oceanus = gaea.giveBirth(&amp;quot;Oceanus&amp;quot;, uranus, MALE);&lt;br /&gt;
        Deity tethys = gaea.giveBirth(&amp;quot;Tethys&amp;quot;, uranus, FEMALE);&lt;br /&gt;
        // Generation 3&lt;br /&gt;
        Deity leto = phoebe.giveBirth(&amp;quot;Leto&amp;quot;, coeus, FEMALE);&lt;br /&gt;
        Deity hestia = rhea.giveBirth(&amp;quot;Hestia&amp;quot;, cronus, FEMALE);&lt;br /&gt;
        Deity pluto = rhea.giveBirth(&amp;quot;Pluto&amp;quot;, cronus, MALE);&lt;br /&gt;
        Deity poseidon = rhea.giveBirth(&amp;quot;Poseidon&amp;quot;, cronus, MALE);&lt;br /&gt;
        Deity zeus = rhea.giveBirth(&amp;quot;Zeus&amp;quot;, cronus, MALE);&lt;br /&gt;
        Deity hera = rhea.giveBirth(&amp;quot;Hera&amp;quot;, cronus, FEMALE);&lt;br /&gt;
        Deity demeter = rhea.giveBirth(&amp;quot;Demeter&amp;quot;, cronus, FEMALE);&lt;br /&gt;
        // Generation 4&lt;br /&gt;
        Deity iapetus = tethys.giveBirth(&amp;quot;Iapetus&amp;quot;, coeus, MALE);&lt;br /&gt;
        Deity clymene = new Deity(&amp;quot;Clymene&amp;quot;, FEMALE);&lt;br /&gt;
        Deity apollo = leto.giveBirth(&amp;quot;Apollo&amp;quot;, zeus, MALE);&lt;br /&gt;
        Deity artemis = leto.giveBirth(&amp;quot;Artemis&amp;quot;, zeus, MALE);&lt;br /&gt;
        Deity persephone = demeter.giveBirth(&amp;quot;Persephone&amp;quot;, zeus, MALE);&lt;br /&gt;
        Deity ares = hera.giveBirth(&amp;quot;Ares&amp;quot;, zeus, MALE);&lt;br /&gt;
        Deity hebe = hera.giveBirth(&amp;quot;Hebe&amp;quot;, zeus, FEMALE);&lt;br /&gt;
        Deity hephaestus = hera.giveBirth(&amp;quot;Hephaestus&amp;quot;, zeus, MALE);&lt;br /&gt;
        Deity prometheus = clymene.giveBirth(&amp;quot;Prometheus&amp;quot;, iapetus, MALE);&lt;br /&gt;
        Deity atlas = clymene.giveBirth(&amp;quot;Atlas&amp;quot;, iapetus, MALE);&lt;br /&gt;
        Deity epimetheus = clymene.giveBirth(&amp;quot;Epimetheus&amp;quot;, iapetus, FEMALE);&lt;br /&gt;
        Deity dione = new Deity(&amp;quot;Dione&amp;quot;, FEMALE);&lt;br /&gt;
        dione.giveBirth(&amp;quot;Aphrodite&amp;quot;, zeus, FEMALE);&lt;br /&gt;
        // Begin a new local transaction so that we can persist a new entity&lt;br /&gt;
        em.getTransaction().begin();&lt;br /&gt;
        // note that we only need to explicitly persist a single root of the&lt;br /&gt;
        // object graph (the family tree, in this case), since we have the&lt;br /&gt;
        // &amp;quot;cascade&amp;quot; annotation on all the relations&lt;br /&gt;
        em.persist(zeus);&lt;br /&gt;
        // Commit the transaction, which will cause the entity to&lt;br /&gt;
        // be stored in the database&lt;br /&gt;
        em.getTransaction().rumit();&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Run some sample queries against the family tree model.&lt;br /&gt;
     *  &lt;br /&gt;
     * @param  em  the EntityManager to use&lt;br /&gt;
     */&lt;br /&gt;
    public static void runQueries(EntityManager em) {&lt;br /&gt;
        System.out.println(&amp;quot;Running query to find all instances..&amp;quot;);&lt;br /&gt;
        // Perform a simple query for all the Deity entities&lt;br /&gt;
        Query q = em.createQuery(&amp;quot;select x from Deity x&amp;quot;);&lt;br /&gt;
        // Go through each of the entities and print out each of their&lt;br /&gt;
        // messages, as well as the date on which it was created &lt;br /&gt;
        for (Deity m : (List&amp;lt;Deity&amp;gt;) q.getResultList()) {&lt;br /&gt;
            System.out.println(m.getName());&lt;br /&gt;
        }&lt;br /&gt;
        q = em.createQuery(&amp;quot;select x from Deity x &amp;quot;&lt;br /&gt;
            + &amp;quot;where x.father.name = &amp;quot;Zeus&amp;quot;&amp;quot;);&lt;br /&gt;
        for (Deity m : (List&amp;lt;Deity&amp;gt;) q.getResultList()) {&lt;br /&gt;
            System.out.println(&amp;quot;Child of Zeus: &amp;quot; + m.getName());&lt;br /&gt;
        }&lt;br /&gt;
        q = em.createNamedQuery(&amp;quot;siblings&amp;quot;).&lt;br /&gt;
            setParameter(1, em.getReference(Deity.class, &amp;quot;Rhea&amp;quot;));&lt;br /&gt;
        for (Deity m : (List&amp;lt;Deity&amp;gt;) em.createNamedQuery(&amp;quot;siblings&amp;quot;).&lt;br /&gt;
            setParameter(1, em.getReference(Deity.class, &amp;quot;Rhea&amp;quot;)).&lt;br /&gt;
            getResultList()) {&lt;br /&gt;
            System.out.println(&amp;quot;Siblings of Rhea: &amp;quot; + m.getName());&lt;br /&gt;
        }&lt;br /&gt;
        for (Deity m : (List&amp;lt;Deity&amp;gt;) em.createNamedQuery(&amp;quot;half-siblings&amp;quot;).&lt;br /&gt;
            setParameter(1, em.getReference(Deity.class, &amp;quot;Apollo&amp;quot;)).&lt;br /&gt;
            getResultList()) {&lt;br /&gt;
            System.out.println(&amp;quot;Half-siblings of Apollo: &amp;quot; + m.getName());&lt;br /&gt;
        }&lt;br /&gt;
        for (Deity m : (List&amp;lt;Deity&amp;gt;) em.createNamedQuery(&amp;quot;cousins&amp;quot;).&lt;br /&gt;
            setParameter(1, em.getReference(Deity.class, &amp;quot;Leto&amp;quot;)).&lt;br /&gt;
            getResultList()) {&lt;br /&gt;
            System.out.println(&amp;quot;Cousins of Leto: &amp;quot; + m.getName());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Licensed to the Apache Software Foundation (ASF) under one&lt;br /&gt;
 * or more contributor license agreements.  See the NOTICE file&lt;br /&gt;
 * distributed with this work for additional information&lt;br /&gt;
 * regarding copyright ownership.  The ASF licenses this file&lt;br /&gt;
 * to you under the Apache License, Version 2.0 (the&lt;br /&gt;
 * &amp;quot;License&amp;quot;); you may not use this file except in compliance&lt;br /&gt;
 * with the License.  You may obtain a copy of the License at&lt;br /&gt;
 *&lt;br /&gt;
 * http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 *&lt;br /&gt;
 * Unless required by applicable law or agreed to in writing,&lt;br /&gt;
 * software distributed under the License is distributed on an&lt;br /&gt;
 * &amp;quot;AS IS&amp;quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY&lt;br /&gt;
 * KIND, either express or implied.  See the License for the&lt;br /&gt;
 * specific language governing permissions and limitations&lt;br /&gt;
 * under the License.    &lt;br /&gt;
 */&lt;br /&gt;
package relations;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import javax.persistence.Basic;&lt;br /&gt;
import javax.persistence.CascadeType;&lt;br /&gt;
import javax.persistence.Entity;&lt;br /&gt;
import javax.persistence.Enumerated;&lt;br /&gt;
import javax.persistence.EnumType;&lt;br /&gt;
import javax.persistence.Id;&lt;br /&gt;
import javax.persistence.NamedQuery;&lt;br /&gt;
import javax.persistence.NamedQueries;&lt;br /&gt;
import javax.persistence.OneToMany;&lt;br /&gt;
import javax.persistence.OneToOne;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * An entity that contains relations corresponding to family tree relations.&lt;br /&gt;
 * This entity demonstrates the following JPA features:&lt;br /&gt;
 *&lt;br /&gt;
 * 1. Enum fields (gender)&lt;br /&gt;
 * 2. @OneToOne relations&lt;br /&gt;
 * 3. @OneToMany relations&lt;br /&gt;
 * 4. Named queries&lt;br /&gt;
 */&lt;br /&gt;
@Entity&lt;br /&gt;
@NamedQueries({&lt;br /&gt;
    // a sibling shares a mother and a father&lt;br /&gt;
    @NamedQuery(name=&amp;quot;siblings&amp;quot;, query=&amp;quot;select distinct sibling1 &amp;quot;&lt;br /&gt;
        + &amp;quot;from Deity sibling1, Deity sibling2 where &amp;quot;&lt;br /&gt;
        + &amp;quot;sibling1.father = sibling2.father &amp;quot;&lt;br /&gt;
        + &amp;quot;and sibling1.mother = sibling2.mother &amp;quot;&lt;br /&gt;
        + &amp;quot;and sibling2 = ?1 and sibling1 &amp;lt;&amp;gt; ?1&amp;quot;),&lt;br /&gt;
    // a half-siling shares a mother or a father, but not both&lt;br /&gt;
    @NamedQuery(name=&amp;quot;half-siblings&amp;quot;, query=&amp;quot;select distinct sibling1 &amp;quot;&lt;br /&gt;
        + &amp;quot;from Deity sibling1, Deity sibling2 where &amp;quot;&lt;br /&gt;
        + &amp;quot;((sibling1.father = sibling2.father &amp;quot;&lt;br /&gt;
        + &amp;quot;and sibling1.mother &amp;lt;&amp;gt; sibling2.mother) &amp;quot;&lt;br /&gt;
        + &amp;quot;or (sibling1.father &amp;lt;&amp;gt; sibling2.father &amp;quot;&lt;br /&gt;
        + &amp;quot;and sibling1.mother = sibling2.mother)) &amp;quot;&lt;br /&gt;
        + &amp;quot;and sibling2 = ?1 and sibling1 &amp;lt;&amp;gt; ?1&amp;quot;),&lt;br /&gt;
    // a cousin shares a grandparent, but is not a sibling&lt;br /&gt;
    @NamedQuery(name=&amp;quot;cousins&amp;quot;, query=&amp;quot;select distinct cousin1 &amp;quot;&lt;br /&gt;
        + &amp;quot;from Deity cousin1, Deity cousin2 where &amp;quot;&lt;br /&gt;
        + &amp;quot;(&amp;quot;&lt;br /&gt;
            + &amp;quot;cousin1.father.father = cousin2.father.father &amp;quot;&lt;br /&gt;
            + &amp;quot;or cousin1.father.mother = cousin2.father.mother &amp;quot;&lt;br /&gt;
            + &amp;quot;or cousin1.mother.father = cousin2.mother.father &amp;quot;&lt;br /&gt;
            + &amp;quot;or cousin1.mother.mother = cousin2.mother.mother) &amp;quot;&lt;br /&gt;
        + &amp;quot;and (cousin1.father &amp;lt;&amp;gt; cousin2.father) &amp;quot;&lt;br /&gt;
        + &amp;quot;and (cousin1.mother &amp;lt;&amp;gt; cousin2.mother) &amp;quot;&lt;br /&gt;
        + &amp;quot;and cousin2 = ?1 and cousin1 &amp;lt;&amp;gt; ?1&amp;quot;)&lt;br /&gt;
    })&lt;br /&gt;
public class Deity implements Serializable {&lt;br /&gt;
    // the Id is the name, which is generally a bad idea, but we are&lt;br /&gt;
    // confident that diety names will be unique&lt;br /&gt;
    @Id&lt;br /&gt;
    private String name;&lt;br /&gt;
    @Basic @Enumerated(EnumType.STRING)&lt;br /&gt;
    private Gender gender;&lt;br /&gt;
    @OneToOne(cascade=CascadeType.ALL)&lt;br /&gt;
    private Deity mother;&lt;br /&gt;
    @OneToOne(cascade=CascadeType.ALL)&lt;br /&gt;
    private Deity father;&lt;br /&gt;
    @OneToMany(cascade=CascadeType.ALL)&lt;br /&gt;
    private Set&amp;lt;Deity&amp;gt; children;&lt;br /&gt;
    public static enum Gender { MALE, FEMALE }&lt;br /&gt;
&lt;br /&gt;
    public Deity(String name, Gender gender) {&lt;br /&gt;
        this.name = name;&lt;br /&gt;
        this.gender = gender;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //////////////////////////&lt;br /&gt;
    // Business methods follow&lt;br /&gt;
    //////////////////////////&lt;br /&gt;
    /** &lt;br /&gt;
     * She&amp;quot;s having a baby... &lt;br /&gt;
     *  &lt;br /&gt;
     * @param  childName  the baby name&lt;br /&gt;
     * @return the new child&lt;br /&gt;
     *&lt;br /&gt;
     * @throws IllegalArgumentException if the person is not a woman, or&lt;br /&gt;
     *                                  if the person is unmarried (illegitimate&lt;br /&gt;
     *                                  children are not yet supported)&lt;br /&gt;
     */&lt;br /&gt;
    public Deity giveBirth(String childName, Deity childFather, Gender gender) {&lt;br /&gt;
        if (this.gender != Gender.FEMALE)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Only women can have children!&amp;quot;);&lt;br /&gt;
        if (childName == null)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;No child name!&amp;quot;);&lt;br /&gt;
        // create the child&lt;br /&gt;
        Deity child = new Deity(childName, gender);&lt;br /&gt;
        // set the parents in the children...&lt;br /&gt;
        child.mother = this;&lt;br /&gt;
        // add the child to this member&amp;quot;s children&lt;br /&gt;
        if (children == null)&lt;br /&gt;
            children = new HashSet&amp;lt;Deity&amp;gt;();&lt;br /&gt;
        children.add(child);&lt;br /&gt;
        if (childFather != null) {&lt;br /&gt;
            child.father = childFather;&lt;br /&gt;
            if (childFather.children == null)&lt;br /&gt;
                childFather.children = new HashSet&amp;lt;Deity&amp;gt;();&lt;br /&gt;
            childFather.children.add(child);&lt;br /&gt;
        }&lt;br /&gt;
        return child;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ////////////////////////////////////&lt;br /&gt;
    // Property accessor methods follow&lt;br /&gt;
    ////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
    public void setName(String name) {&lt;br /&gt;
        this.name = name;&lt;br /&gt;
    }&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return this.name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setGender(Gender gender) {&lt;br /&gt;
        this.gender = gender;&lt;br /&gt;
    }&lt;br /&gt;
    public Gender getGender() {&lt;br /&gt;
        return this.gender;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setMother(Deity mother) {&lt;br /&gt;
        this.mother = mother;&lt;br /&gt;
    }&lt;br /&gt;
    public Deity getMother() {&lt;br /&gt;
        return this.mother;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setFather(Deity father) {&lt;br /&gt;
        this.father = father;&lt;br /&gt;
    }&lt;br /&gt;
    public Deity getFather() {&lt;br /&gt;
        return this.father;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setChildren(Set&amp;lt;Deity&amp;gt; children) {&lt;br /&gt;
        this.children = children;&lt;br /&gt;
    }&lt;br /&gt;
    public Set&amp;lt;Deity&amp;gt; getChildren() {&lt;br /&gt;
        return this.children;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>