/******************************************************************************* | |
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* Oracle - initial API and implementation from Oracle TopLink | |
******************************************************************************/ | |
package org.eclipse.persistence.testing.models.inheritance; | |
import java.util.*; | |
import java.io.*; | |
import java.math.BigDecimal; | |
import org.eclipse.persistence.indirection.*; | |
/** | |
* STI stands for Single Table Inheritance. | |
* STI_Employee references and referenced by STI_Project class, | |
* which is mapped with its subclasses STI_SmallProject and STI_LargeProject | |
* to a single table. | |
* STI_Employee is a simplified version of Employee. | |
*/ | |
public class STI_Employee implements Serializable { | |
/** Primary key, maped as a direct-to-field, BigDecimal -> NUMBER, that makes use of sequence numbers to generate the id. */ | |
public BigDecimal id; | |
/** Direct-to-field mapping, String -> VARCHAR. */ | |
public String firstName; | |
/** Direct-to-field mapping, String -> VARCHAR. */ | |
public String lastName; | |
/** One-to-one mapping (same class relationship), employee references its manager through a foreign key. */ | |
public ValueHolderInterface manager; | |
/** One-to-many mapping (same class relationship), inverse relationship to manager, uses manager foreign key in the target. */ | |
public ValueHolderInterface managedEmployees; | |
/** Many-to-many mapping, employee references its projects through an intermediate join table. */ | |
public ValueHolderInterface projects; | |
/** | |
* For fields that make use of indirection the constructor should build the value holders. | |
*/ | |
public STI_Employee() { | |
this.firstName = ""; | |
this.lastName = ""; | |
this.manager = new ValueHolder(); | |
this.managedEmployees = new ValueHolder(new Vector()); | |
this.projects = new ValueHolder(new Vector()); | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
*/ | |
public void addManagedEmployee(STI_Employee employee) { | |
getManagedEmployees().addElement(employee); | |
employee.setManager(this); | |
} | |
public void addProject(STI_Project project) { | |
getProjects().addElement(project); | |
} | |
public String getFirstName() { | |
return firstName; | |
} | |
public BigDecimal getId() { | |
return id; | |
} | |
public String getLastName() { | |
return lastName; | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public Vector getManagedEmployees() { | |
return (Vector)managedEmployees.getValue(); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public STI_Employee getManager() { | |
return (STI_Employee)manager.getValue(); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public Vector getProjects() { | |
return (Vector)projects.getValue(); | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
*/ | |
public void removeManagedEmployee(STI_Employee employee) { | |
getManagedEmployees().removeElement(employee); | |
employee.setManager(null); | |
} | |
public void removeProject(STI_Project project) { | |
getProjects().removeElement(project); | |
} | |
public void setFirstName(String firstName) { | |
this.firstName = firstName; | |
} | |
/** | |
* Set the persistent identifier of the receiver. | |
* Note this should never be changed. | |
* Consider making the primary key set methods protected or not having them. | |
*/ | |
public void setId(BigDecimal id) { | |
this.id = id; | |
} | |
public void setLastName(String lastName) { | |
this.lastName = lastName; | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setManagedEmployees(Vector managedEmployees) { | |
this.managedEmployees.setValue(managedEmployees); | |
} | |
/** | |
* For bi-directional relationships, it is important to maintain both sides of the relationship when changing it. | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setManager(STI_Employee manager) { | |
this.manager.setValue(manager); | |
} | |
/** | |
* Notice that the usage of value holders does not effect the public interface or usage of the class. | |
* The get/set methods must however be changed to wrap/unwrap the value holder. | |
*/ | |
public void setProjects(Vector projects) { | |
this.projects.setValue(projects); | |
} | |
/** | |
* Print the first & last name | |
*/ | |
public String toString() { | |
StringWriter writer = new StringWriter(); | |
writer.write("STI_Employee: "); | |
writer.write(getFirstName()); | |
writer.write(" "); | |
writer.write(getLastName()); | |
return writer.toString(); | |
} | |
} |