/*
 * Copyright (c) 1998, 2020 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.models.relationshipmaintenance;

public class FieldLocation {
    protected int id;
    public java.lang.String city;

    /**
     * FieldLocation constructor comment.
     */
    public FieldLocation() {
        super();
    }

    public static FieldLocation example1() {
        FieldLocation instance = new FieldLocation();
        instance.setCity("Ottawa");
        return instance;
    }

    public static FieldLocation example2() {
        FieldLocation instance = new FieldLocation();
        instance.setCity("Toronto");
        return instance;
    }

    /**
     * Insert the method's description here.
     * Creation date: (1/30/01 7:28:22 PM)
     * @return java.lang.String
     */
    public java.lang.String getCity() {
        return city;
    }

    /**
     * Insert the method's description here.
     * Creation date: (1/30/01 6:52:23 PM)
     * @return int
     */
    public int getId() {
        return id;
    }

    /**
     * Insert the method's description here.
     * Creation date: (1/30/01 7:28:22 PM)
     * @param newCity java.lang.String
     */
    public void setCity(java.lang.String newCity) {
        city = newCity;
    }

    /**
     * Insert the method's description here.
     * Creation date: (1/30/01 6:52:23 PM)
     * @param newId int
     */
    public void setId(int newId) {
        id = newId;
    }

    public String toString() {
        return org.eclipse.persistence.internal.helper.Helper.getShortClassName(this) + "(" + id + ", " + System.identityHashCode(this) + ")";
    }
}
