Java Tutorial/JPA/ResultSet Mapping
Версия от 17:44, 31 мая 2010; (обсуждение)
Содержание
Alias Column In Resultset Mapping
File: Employee.java
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
@Entity
@Table(name="EMP")
@SqlResultSetMappings({
@SqlResultSetMapping(
name="EmployeeWithAddressColumnAlias",
entities={@EntityResult(entityClass=Employee.class,
fields=@FieldResult(name="id", column="EMP_ID")),
@EntityResult(entityClass=Address.class)}
)
})
public class Employee {
@Id
@Column(name="EMP_ID")
private int id;
private String name;
@OneToOne
private Address address;
@ManyToOne
@JoinColumn(name="DEPT_ID")
private Department department;
@ManyToOne
@JoinColumn(name="MANAGER_ID")
private Employee manager;
@OneToMany(mappedBy="manager")
private Collection<Employee> directs = new ArrayList<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Collection<Employee> getDirects() {
return directs;
}
public void addDirect(Employee employee) {
if (!getDirects().contains(employee)) {
getDirects().add(employee);
if (employee.getManager() != null) {
employee.getManager().getDirects().remove(employee);
}
employee.setManager(this);
}
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
@Entity
class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public String toString() {
return "Department id: " + getId() +
", name: " + getName();
}
}
@Entity
class Address {
@Id
private int id;
private String street;
private String city;
private String state;
private String zip;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(String address) {
this.street = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String toString() {
return "Address id: " + getId() +
", street: " + getStreet() +
", city: " + getCity() +
", state: " + getState() +
", zip: " + getZip();
}
}
ID Class ResultSet Mapping
File: Employee.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
@Entity
@Table(name="EMP")
@IdClass(EmployeeId.class)
@SqlResultSetMapping(
name="EmployeeAndManager",
entities={
@EntityResult(entityClass=Employee.class),
@EntityResult(
entityClass=Employee.class,
fields={
@FieldResult(name="country", column="MGR_COUNTRY"),
@FieldResult(name="id", column="MGR_ID"),
@FieldResult(name="name", column="MGR_NAME"),
@FieldResult(name="manager.country", column="MGR_MGR_COUNTRY"),
@FieldResult(name="manager.id", column="MGR_MGR_ID")
}
)
}
)
public class Employee {
@Id private String country;
@Id
private int id;
private String name;
@ManyToOne
@JoinColumns({
@JoinColumn(name="MANAGER_COUNTRY", referencedColumnName="COUNTRY"),
@JoinColumn(name="MANAGER_ID", referencedColumnName="ID")
})
private Employee manager;
@OneToMany(mappedBy="manager")
private Collection<Employee> directs = new ArrayList<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<Employee> getDirects() {
return directs;
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
class EmployeeId implements Serializable {
private String country;
private int id;
public EmployeeId() {}
public EmployeeId(String country, int id) {
this.country = country;
this.id = id;
}
public String getCountry() { return country; }
public int getId() { return id; }
public boolean equals(Object o) {
return ((o instanceof EmployeeId) &&
country.equals(((EmployeeId)o).getCountry()) &&
id == ((EmployeeId) o).getId());
}
public int hashCode() {
return country.hashCode() + id;
}
}
Resultset Mapping With Two Entities
File: Employee.java
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
@Entity
@Table(name="EMP")
@SqlResultSetMappings({
@SqlResultSetMapping(
name="EmployeeWithAddress",
entities={@EntityResult(entityClass=Employee.class),
@EntityResult(entityClass=Address.class)}
)
})
public class Employee {
@Id
@Column(name="EMP_ID")
private int id;
private String name;
@OneToOne
private Address address;
@ManyToOne
@JoinColumn(name="DEPT_ID")
private Department department;
@ManyToOne
@JoinColumn(name="MANAGER_ID")
private Employee manager;
@OneToMany(mappedBy="manager")
private Collection<Employee> directs = new ArrayList<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Collection<Employee> getDirects() {
return directs;
}
public void addDirect(Employee employee) {
if (!getDirects().contains(employee)) {
getDirects().add(employee);
if (employee.getManager() != null) {
employee.getManager().getDirects().remove(employee);
}
employee.setManager(this);
}
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
@Entity
class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public String toString() {
return "Department id: " + getId() +
", name: " + getName();
}
}
@Entity
class Address {
@Id
private int id;
private String street;
private String city;
private String state;
private String zip;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(String address) {
this.street = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String toString() {
return "Address id: " + getId() +
", street: " + getStreet() +
", city: " + getCity() +
", state: " + getState() +
", zip: " + getZip();
}
}
Single Table ResultSet Mapping
File: Employee.java
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
@Entity
@Table(name="EMP")
@SqlResultSetMappings({
@SqlResultSetMapping(
name="employeeResult",
entities=@EntityResult(entityClass=Employee.class))
})
public class Employee {
@Id
@Column(name="EMP_ID")
private int id;
private String name;
@OneToOne
private Address address;
@ManyToOne
@JoinColumn(name="DEPT_ID")
private Department department;
@ManyToOne
@JoinColumn(name="MANAGER_ID")
private Employee manager;
@OneToMany(mappedBy="manager")
private Collection<Employee> directs = new ArrayList<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Collection<Employee> getDirects() {
return directs;
}
public void addDirect(Employee employee) {
if (!getDirects().contains(employee)) {
getDirects().add(employee);
if (employee.getManager() != null) {
employee.getManager().getDirects().remove(employee);
}
employee.setManager(this);
}
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
@Entity
class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public String toString() {
return "Department id: " + getId() +
", name: " + getName();
}
}
@Entity
class Address {
@Id
private int id;
private String street;
private String city;
private String state;
private String zip;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(String address) {
this.street = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String toString() {
return "Address id: " + getId() +
", street: " + getStreet() +
", city: " + getCity() +
", state: " + getState() +
", zip: " + getZip();
}
}
Sql ResultSet Mapping For Hierarchical Entity
File: Employee.java
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="EMPLOYEE_STAGE")
@Inheritance
@DiscriminatorColumn(name="EMP_TYPE")
@SqlResultSetMapping(
name="EmployeeStageMapping",
entities=
@EntityResult(
entityClass=Employee.class,
discriminatorColumn="TYPE",
fields={
@FieldResult(name="startDate", column="START_DATE"),
@FieldResult(name="dailyRate", column="DAILY_RATE"),
@FieldResult(name="hourlyRate", column="HOURLY_RATE")
}
)
)
public abstract class Employee {
@Id private int id;
private String name;
@Temporal(TemporalType.DATE)
@Column(name="START_DATE")
private Date startDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public String toString() {
return "Employee id: " + getId() + " name: " + getName();
}
}
@Entity
class ContractEmployee extends Employee {
@Column(name="DAILY_RATE")
private int dailyRate;
private int term;
public int getDailyRate() {
return dailyRate;
}
public void setDailyRate(int dailyRate) {
this.dailyRate = dailyRate;
}
public int getTerm() {
return term;
}
public void setTerm(int term) {
this.term = term;
}
public String toString() {
return "ContractEmployee id: " + getId() + " name: " + getName();
}
}
@Entity(name="PTEmp")
@DiscriminatorValue("PTEmp")
class PartTimeEmployee extends Employee {
@Column(name="HOURLY_RATE")
private float hourlyRate;
public float getHourlyRate() {
return hourlyRate;
}
public void setHourlyRate(float hourlyRate) {
this.hourlyRate = hourlyRate;
}
public String toString() {
return "PartTimeEmployee id: " + getId() + " name: " + getName();
}
}
Sql ResultSet Mapping With Entity And Column
File: Employee.java
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
@Entity
@Table(name="EMP")
@SqlResultSetMappings({
@SqlResultSetMapping(
name="DepartmentSummary",
entities={@EntityResult(entityClass=Department.class,
fields=@FieldResult(name="name", column="DEPT_NAME")),
@EntityResult(entityClass=Employee.class)},
columns={@ColumnResult(name="TOT_EMP"),
@ColumnResult(name="AVG_SAL")}
)
})
public class Employee {
@Id
@Column(name="EMP_ID")
private int id;
private String name;
@OneToOne
private Address address;
@ManyToOne
@JoinColumn(name="DEPT_ID")
private Department department;
@ManyToOne
@JoinColumn(name="MANAGER_ID")
private Employee manager;
@OneToMany(mappedBy="manager")
private Collection<Employee> directs = new ArrayList<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Collection<Employee> getDirects() {
return directs;
}
public void addDirect(Employee employee) {
if (!getDirects().contains(employee)) {
getDirects().add(employee);
if (employee.getManager() != null) {
employee.getManager().getDirects().remove(employee);
}
employee.setManager(this);
}
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
@Entity
class Department {
@Id
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public String toString() {
return "Department id: " + getId() +
", name: " + getName();
}
}
@Entity
class Address {
@Id
private int id;
private String street;
private String city;
private String state;
private String zip;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(String address) {
this.street = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String toString() {
return "Address id: " + getId() +
", street: " + getStreet() +
", city: " + getCity() +
", state: " + getState() +
", zip: " + getZip();
}
}
Sql ResultSet Mapping With Entity Result And Field Result
File: Employee.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
@Entity
@Table(name="EMP")
@IdClass(EmployeeId.class)
@SqlResultSetMapping(
name="EmployeeAndManager",
entities={
@EntityResult(entityClass=Employee.class),
@EntityResult(
entityClass=Employee.class,
fields={
@FieldResult(name="country", column="MGR_COUNTRY"),
@FieldResult(name="id", column="MGR_ID"),
@FieldResult(name="name", column="MGR_NAME"),
@FieldResult(name="manager.country", column="MGR_MGR_COUNTRY"),
@FieldResult(name="manager.id", column="MGR_MGR_ID")
}
)
}
)
public class Employee {
@Id private String country;
@Id
private int id;
private String name;
@ManyToOne
@JoinColumns({
@JoinColumn(name="MANAGER_COUNTRY", referencedColumnName="COUNTRY"),
@JoinColumn(name="MANAGER_ID", referencedColumnName="ID")
})
private Employee manager;
@OneToMany(mappedBy="manager")
private Collection<Employee> directs = new ArrayList<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<Employee> getDirects() {
return directs;
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
}
class EmployeeId implements Serializable {
private String country;
private int id;
public EmployeeId() {}
public EmployeeId(String country, int id) {
this.country = country;
this.id = id;
}
public String getCountry() { return country; }
public int getId() { return id; }
public boolean equals(Object o) {
return ((o instanceof EmployeeId) &&
country.equals(((EmployeeId)o).getCountry()) &&
id == ((EmployeeId) o).getId());
}
public int hashCode() {
return country.hashCode() + id;
}
}