/*
 * 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.jdbc.annotations;


import java.util.*;

import javax.persistence.*;

import org.apache.openjpa.jdbc.meta.strats.*;
import org.apache.openjpa.persistence.*;
import org.apache.openjpa.persistence.jdbc.*;


@Entity
@DataStoreId(strategy = GenerationType.SEQUENCE, generator = "system")
@DataCache(enabled = false)
@FetchGroup(name = "detail", attributes = {
    @FetchAttribute(name = "rel", recursionDepth = -1),
    @FetchAttribute(name = "seq")
})
@VersionStrategy(StateComparisonVersionStrategy.ALIAS)
public class ExtensionsEntity {

    @GeneratedValue(generator = "uuid-hex")
    @Column(name = "UUID_HEX")
    private String uuid;
    
    @GeneratedValue(generator = "uuid-string")
    @Column(name = "UUID_STRING")
    private String uuidString;

    @GeneratedValue(generator = "uuid-type4-hex")
    @Column(name = "UUIDT4_HEX")
    private String uuidT4Hex;

    @GeneratedValue(generator = "uuid-type4-string")
    @Column(name = "UUIDT4_STRING")
    private String uuidT4String;

    @Basic(fetch = FetchType.LAZY)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "system")
    @ReadOnly
    private int seq;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "REL_ID", referencedColumnName = "ID")
    @Dependent
    @InverseLogical("owner")
    private ExtensionsEntity rel;

    @ManyToOne
    @JoinColumn(name = "OWNER_ID", referencedColumnName = "ID")
    private ExtensionsEntity owner;

    @ManyToMany
    @LRS
    private Collection<ExtensionsEntity> lrs;

    @ManyToMany
    @EagerFetchMode(FetchMode.JOIN)
    @ElementClassCriteria
    @ElementDependent
    private Collection<ExtensionsEntity> eager;

    @ExternalValues({ "M=1", "F=2" })
    @Type(int.class)
    private char externalValues;

    @Persistent
    @Externalizer("getName")
    @Factory("Class.forName")
    private Class externalizer;

    public char getExternalValues() {
        return this.externalValues;
    }

    public void setExternalValues(char externalValues) {
        this.externalValues = externalValues;
    }

    public Class getExternalizer() {
        return this.externalizer;
    }

    public void setExternalizer(Class externalizer) {
        this.externalizer = externalizer;
    }
}
