/*
 * Copyright (c) 2011, 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:
//     James Sutherland - initial design and implementation
package org.eclipse.persistence.annotations;


/**
 * Configures what type of database change notification an entity/descriptor should use.
 * This is only relevant if the persistence unit/session has been configured with a DatabaseEventListener,
 * such as the OracleChangeNotificationListener that receives database change events.
 * This allows for the EclipseLink cache to be invalidated or updated from database changes.
 *
 * @see Cache#databaseChangeNotificationType()
 * @see org.eclipse.persistence.descriptors.CachePolicy#setDatabaseChangeNotificationType(DatabaseChangeNotificationType)
 * @author James Sutherland
 * @since EclipseLink 2.4
 */
public enum DatabaseChangeNotificationType {
    /**
     * No database change events will be processed.
     */
    NONE,

    /**
     * Invalidates the EclipseLink cache when a database change event is received for an object.
     * This requires a DatabaseEventListener to be configured with the persistence unit or session.
     * This requires that the database change can be determine to affect the object, some database change events,
     * such as the OracleChangeNotificationListener (Oracle DCN/QCN) only give the ROWID, so changes to secondary
     * table or relationships may not be able to be determined to affect and object unless its version is also changed.
     */
    INVALIDATE
}
