/*******************************************************************************
 * Copyright (c) 2005, 2009 SAP. 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:
 *     SAP - initial API and implementation
 ******************************************************************************/

package org.eclipse.persistence.testing.models.wdf.jpa1.employee;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Cacheable;
import javax.persistence.ColumnResult;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.Id;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.QueryHint;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
import javax.persistence.Version;

import org.eclipse.persistence.config.HintValues;
import org.eclipse.persistence.config.QueryHints;

@Cacheable(true)
@Entity
@Table(name = "TMP_DEP")
@NamedQueries( {
        @NamedQuery(name = "getAllDepartmentsCached", query = "select d from Department d", hints = { @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE) }) ,
        @NamedQuery(name = "getDepartmentByName", query = "select d from Department d where d.name = ?1"),
        @NamedQuery(name = "getDepartmentById", query = "select d from Department d where d.id = ?1"),
        @NamedQuery(name = "getDepartmentUnCached", query = "select d from Department d where d.name = ?1", hints = { }),
        @NamedQuery(name = "getDepartmentCached", query = "select d from Department d where d.name = ?1", hints = { @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE) }) })
@NamedNativeQueries( {
        @NamedNativeQuery(name = "getDepartmentWithId10SQL_class", query = "select * from TMP_DEP D where D.ID = 10", resultClass = Department.class),
        @NamedNativeQuery(name = "getDepartmentWithId10SQL_mapping", query = "select * from TMP_DEP D where D.ID = 10", resultSetMapping = "departmentByClass"),
        @NamedNativeQuery(name = "getDepartmentName", query = "select name as \"HUTZLIPUTZ\" from TMP_DEP D where D.ID = 10", resultSetMapping = "departmentNameOnly"),
        @NamedNativeQuery(name = "getDepartmentFieldByField", query = "select id as \"D_ID\", name as \"D_NAME\", version as \"D_VERSION\" from TMP_DEP D where D.ID = 10", resultSetMapping = "departmentByFields"),
        @NamedNativeQuery(name = "getDepartmentFieldByField1", query = "select id as \"ID\", name as \"NAME\" from TMP_DEP D where D.ID = 1", resultSetMapping = "departmentByFields1") })
@SqlResultSetMappings( {
        @SqlResultSetMapping(name = "departmentByClass", entities = { @EntityResult(entityClass = Department.class) }),
        @SqlResultSetMapping(name = "departmentNameOnly", columns = { @ColumnResult(name = "HUTZLIPUTZ") }),
        @SqlResultSetMapping(name = "departmentByFields", entities = { @EntityResult(entityClass = Department.class, fields = {
                @FieldResult(name = "id", column = "D_ID"), @FieldResult(name = "name", column = "D_NAME"),
                @FieldResult(name = "version", column = "D_VERSION") }) }),
        @SqlResultSetMapping(name = "departmentByFields1", columns = { @ColumnResult(name = "ID"), @ColumnResult(name = "NAME") }) })
public class Department implements Serializable {

    public static final String HUGO = "hugo";

    private static final long serialVersionUID = 1L;

    public void setId(int id) {
        this._id = id;
    }

    private int _id;

    private String _name;

    private short version;

    // this constructor should be protected
    protected Department() {
    }

    public Department(int aId, String aName) {
        _id = aId;
        _name = aName;
    }

    @Id
    public int getId() {
        return _id;
    }

    public void setName(String aName) {
        _name = aName;
    }

    @Basic
    public String getName() {
        return _name;
    }

    @Version
    public short getVersion() {
        return version;
    }

    // called by EntityManager
    protected void setVersion(short newVersion) {
        version = newVersion;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Department) {
            Department other = (Department) obj;
            if (_id != other._id) {
                return false;
            }
            if (_name == null) {
                return other._name == null;
            } else {
                return _name.equals(other._name);
            }
        }
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        return _id;
    }

    public Object writeReplace() {
        Department copy = new Department();
        copy._id = _id;
        copy._name = HUGO;
        copy.version = version;
        return copy;
    }

    public static class KrassDep extends Department {
        private static final long serialVersionUID = 1L;
        private final String gnubbelWurst;

        public KrassDep(String gnubbelWurst) {
            super();
            this.gnubbelWurst = gnubbelWurst;
        }

        public String getGnubbelWurst() {
            return gnubbelWurst;
        }
    }
}
