如下图所示建立工程: 数据库SQL: -- -- PostgreSQL database dump -- -- Started on 2009-03-05 22:48:23 SET client_encoding = 'UTF8'; SET standard_conforming_strings = off; SET check_function_bodies = false; SET client_min_messages = warning; SET escape_string_warning = off; SET search_path = public, pg_catalog; -- -- TOC entry 1737 (class 0 OID 18486) -- Dependencies: 1465 -- Data for Name: dept; Type: TABLE DATA; Schema: public; Owner: postgres -- ALTER TABLE dept DISABLE TRIGGER ALL; INSERT INTO dept (deptno, dname, loc, versionno) VALUES (10, 'ACCOUNTING', 'NEW YORK', 0); INSERT INTO dept (deptno, dname, loc, versionno) VALUES (20, 'RESEARCH', 'DALLAS', 0); INSERT INTO dept (deptno, dname, loc, versionno) VALUES (30, 'SALES', 'CHICAGO', 0); INSERT INTO dept (deptno, dname, loc, versionno) VALUES (40, 'OPERATIONS', 'BOSTON', 0); ALTER TABLE dept ENABLE TRIGGER ALL; -- -- TOC entry 1738 (class 0 OID 18489) -- Dependencies: 1466 -- Data for Name: emp; Type: TABLE DATA; Schema: public; Owner: postgres -- ALTER TABLE emp DISABLE TRIGGER ALL; INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.00, NULL, 20); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10); INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.00, NULL, 20); ALTER TABLE emp ENABLE TRIGGER ALL; -- Completed on 2009-03-05 22:48:24 -- -- PostgreSQL database dump complete -- 代码如下: Department.java package openjpa.model; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="dept") public class Department implements Serializable { private static final long serialVersionUID = -1473725629994199849L; @Id private int deptno; @Basic private String dname; @Basic private String loc; @Basic private int versionNo; public int getDeptno() { return this.deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public java.lang.String getDname() { return this.dname; } public void setDname(java.lang.String dname) { this.dname = dname; } public java.lang.String getLoc() { return this.loc; } public void setLoc(java.lang.String loc) { this.loc = loc; } public int getVersionNo() { return this.versionNo; } public void setVersionNo(int versionNo) { this.versionNo = versionNo; } public boolean equals(Object other) { if (!(other instanceof Department)) return false; Department castOther = (Department) other; return this.getDeptno() == castOther.getDeptno(); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append(deptno).append(", "); buf.append(dname).append(", "); buf.append(loc).append(", "); buf.append(versionNo); return buf.toString(); } public int hashCode() { return this.getDeptno(); } } Employee.java package openjpa.model; import java.io.Serializable; import java.util.Date; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity @Table(name="emp") public class Employee implements Serializable { private static final long serialVersionUID = -2928989949805889737L; @Id private long empno; @Basic private String ename; @Basic private String job; @Basic private Short mgr; @Basic private Date hiredate; @Basic private Float sal; @Basic private Float comm; @Basic private int deptno; @OneToOne(optional=true, cascade=CascadeType.ALL) @JoinColumn(name = "deptno", referencedColumnName = "deptno") private Department department; public long getEmpno() { return this.empno; } public void setEmpno(long empno) { this.empno = empno; } public java.lang.String getEname() { return this.ename; } public void setEname(java.lang.String ename) { this.ename = ename; } public java.lang.String getJob() { return this.job; } public void setJob(java.lang.String job) { this.job = job; } public Short getMgr() { return this.mgr; } public void setMgr(Short mgr) { this.mgr = mgr; } public java.util.Date getHiredate() { return this.hiredate; } public void setHiredate(java.util.Date hiredate) { this.hiredate = hiredate; } public Float getSal() { return this.sal; } public void setSal(Float sal) { this.sal = sal; } public Float getComm() { return this.comm; } public void setComm(Float comm) { this.comm = comm; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public Department getDepartment() { return this.department; } public void setDepartment(Department department) { this.department = department; } public boolean equals(Object other) { if (!(other instanceof Employee)) return false; Employee castOther = (Employee) other; return this.getEmpno() == castOther.getEmpno(); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append(empno).append(", "); buf.append(ename).append(", "); buf.append(job).append(", "); buf.append(mgr).append(", "); buf.append(hiredate).append(", "); buf.append(sal).append(", "); buf.append(comm).append(", "); buf.append(deptno).append(", "); buf.append(department).append("}"); return buf.toString(); } public int hashCode() { return (int) this.getEmpno(); } } TestOpenJpa.java package openjpa.test; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import openjpa.model.Department; import openjpa.model.Employee; public class TestOpenJpa { @SuppressWarnings("unchecked") public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("testjpa"); EntityManager em = factory.createEntityManager(); Query q = em.createQuery("select d from Department d"); for (Department d : (List<Department>) q.getResultList()) { System.out.println(d.getDeptno() + " " + d.getDname()); } q = em.createQuery("select e from Employee e"); for (Employee e : (List<Employee>) q.getResultList()) { System.out.println(e.getEmpno() + " " + e.getEname() + " " + e.getDepartment().getDeptno()); } em.getTransaction().begin(); Department d = new Department(); d.setDeptno(50); d.setDname("50"); Employee e = new Employee(); e.setEmpno(7950); e.setDeptno(50); e.setDepartment(d); em.persist(e); em.getTransaction().commit(); em.close(); factory.close(); } } persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"> <persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <class>openjpa.model.Department</class> <class>openjpa.model.Employee</class> <properties> <property name="openjpa.ConnectionURL" value="jdbc:postgresql://localhost/testdb"/> <property name="openjpa.ConnectionDriverName" value="org.postgresql.Driver"/> <property name="openjpa.ConnectionUserName" value="postgres"/> <property name="openjpa.ConnectionPassword" value="postgres"/> </properties> </persistence-unit> </persistence>