/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openjpa.persistence.access;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@Entity
@Inheritance
@Access(AccessType.PROPERTY)
@NamedQueries( {
    @NamedQuery(name="SuperPropertyEntity.query", 
        query="SELECT sfe FROM SuperPropertyEntity sfe WHERE " + 
        "sfe.id = :id AND sfe.name = :name"),
    @NamedQuery(name="SuperPropertyEntity.badQuery", 
        query="SELECT sfe FROM SuperPropertyEntity sfe WHERE " + 
        "sfe.id = :id AND sfe.name = :name AND sfe.crtDate = :crtDate") } )
public class SuperPropertyEntity {

    private int id;
    
    private String name;

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

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Access(AccessType.PROPERTY)
    public String getName() {
        return name;
    }
        
    public boolean equals(Object obj) {
        if (obj instanceof SuperPropertyEntity) {
            SuperPropertyEntity sfe = (SuperPropertyEntity)obj;
            return getId() == sfe.getId() &&
                   getName().equals(sfe.getName());
        }
        return false;
    }
}
