/*
 * Copyright (c) 1998, 2021 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.aggregate;

import java.util.*;
import org.eclipse.persistence.tools.schemaframework.TableDefinition;

public class House {
    private java.lang.String Location;
    private java.lang.String descriptions;
    private java.sql.Timestamp version;
    private java.lang.String type;
    private Vector sellingPoints;
    private Oid insuranceId;

    public House() {
        super();
        sellingPoints = new Vector();
        insuranceId = new Oid();
        insuranceId.setOid(Integer.valueOf(0));
    }

    public java.lang.String getDescriptions() {
        return descriptions;
    }

    public java.lang.String getLocation() {
        return Location;
    }

    public Vector getSellingPoints() {
        return sellingPoints;
    }

    /**
     * For bug 2863721 Add AggregateObject to AggregateCollection.
     * Represents an insurance policy number associated with the house,
     * which is not part of the primary key.
     */
    public Oid getInsuranceId() {
        return insuranceId;
    }

    /**
     * Insert the method's description here.
     * Creation date: (04/14/2000 10:51:13 AM)
     * @return java.lang.String
     */
    public java.lang.String getType() {
        return type;
    }

    /**
     * Insert the method's description here.
     * Creation date: (04/14/2000 9:19:37 AM)
     * @return java.sql.Timestamp
     */
    public java.sql.Timestamp getVersion() {
        return version;
    }

    public void setDescriptions(java.lang.String newDescriptions) {
        descriptions = newDescriptions;
    }

    /**
     * Insert the method's description here.
     * Creation date: (04/11/2000 11:36:25 AM)
     * @param newLocation java.lang.String
     */
    public void setLocation(java.lang.String newLocation) {
        Location = newLocation;
    }

    public void setSellingPoints(Vector sellingPoints) {
        this.sellingPoints = sellingPoints;
    }

    /**
     * For bug 2863721 Add AggregateObject to AggregateCollection.
     * Represents an insurance policy number associated with the house,
     * which is not part of the primary key.
     */
    public void setInsuranceId(Oid insuranceId) {
        this.insuranceId = insuranceId;
    }

    /**
     * Insert the method's description here.
     * Creation date: (04/14/2000 10:51:13 AM)
     * @param newType java.lang.String
     */
    public void setType(java.lang.String newType) {
        type = newType;
    }

    /**
     * Insert the method's description here.
     * Creation date: (04/14/2000 9:19:37 AM)
     * @param newVersion java.sql.Timestamp
     */
    public void setVersion(java.sql.Timestamp newVersion) {
        version = newVersion;
    }

    /**
     * Return a platform independant definition of the database table.
     */
    public static TableDefinition tableDefinition() {
        TableDefinition definition = new TableDefinition();

        definition.setName("HOUSE");

        definition.addPrimaryKeyField("AGENT_ID", java.math.BigDecimal.class, 15);
        definition.addPrimaryKeyField("LOCATION", String.class, 180);
        definition.addField("DESCRIPTIONS", String.class, 200);
        definition.addField("INS_ID", java.math.BigDecimal.class, 15);
        definition.addField("VERSION", java.sql.Timestamp.class, 6);
        definition.addField("TYPE", String.class, 4);
        return definition;
    }
}
