/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.persist.model;
/**
* The metadata for a secondary key field. A secondary key may be specified
* with the {@link SecondaryKey} annotation.
*
* <p>{@code SecondaryKeyMetadata} objects are thread-safe. Multiple threads
* may safely call the methods of a shared {@code SecondaryKeyMetadata}
* object.</p>
*
* @author Mark Hayes
*/
public class SecondaryKeyMetadata extends FieldMetadata {
private static final long serialVersionUID = 8118924993396722502L;
private String keyName;
private Relationship relationship;
private String elementClassName;
private String relatedEntity;
private DeleteAction deleteAction;
/**
* Used by an {@code EntityModel} to construct secondary key metadata.
*/
public SecondaryKeyMetadata(String name,
String className,
String declaringClassName,
String elementClassName,
String keyName,
Relationship relationship,
String relatedEntity,
DeleteAction deleteAction) {
super(name, className, declaringClassName);
this.elementClassName = elementClassName;
this.keyName = keyName;
this.relationship = relationship;
this.relatedEntity = relatedEntity;
this.deleteAction = deleteAction;
}
/**
* Returns the class name of the array or collection element for a {@link
* Relationship#ONE_TO_MANY ONE_TO_MANY} or {@link
* Relationship#MANY_TO_MANY MANY_TO_MANY} relationship, or null for a
* Relationship#ONE_TO_ONE ONE_TO_ONE} or {@link Relationship#MANY_TO_ONE
* MANY_TO_ONE} relationship.
*/
public String getElementClassName() {
return elementClassName;
}
/**
* Returns the key name, which may be different from the field name.
*/
public String getKeyName() {
return keyName;
}
/**
* Returns the relationship between instances of the entity class and the
* secondary keys. This may be specified using the {@link
* SecondaryKey#relate} annotation.
*/
public Relationship getRelationship() {
return relationship;
}
/**
* Returns the class name of the related (foreign) entity, for which
* foreign key constraints are specified using the {@link
* SecondaryKey#relatedEntity} annotation.
*/
public String getRelatedEntity() {
return relatedEntity;
}
/**
* Returns the action to take when a related entity is deleted having a
* primary key value that exists as a secondary key value for this entity.
* This may be specified using the {@link
* SecondaryKey#onRelatedEntityDelete} annotation.
*/
public DeleteAction getDeleteAction() {
return deleteAction;
}
@Override
public boolean equals(Object other) {
if (other instanceof SecondaryKeyMetadata) {
SecondaryKeyMetadata o = (SecondaryKeyMetadata) other;
return super.equals(o) &&
relationship == o.relationship &&
ClassMetadata.nullOrEqual(deleteAction, o.deleteAction) &&
ClassMetadata.nullOrEqual(keyName, o.keyName) &&
ClassMetadata.nullOrEqual(elementClassName,
o.elementClassName) &&
ClassMetadata.nullOrEqual(relatedEntity, o.relatedEntity);
} else {
return false;
}
}
@Override
public int hashCode() {
return super.hashCode() +
relationship.hashCode() +
ClassMetadata.hashCode(deleteAction) +
ClassMetadata.hashCode(keyName) +
ClassMetadata.hashCode(elementClassName) +
ClassMetadata.hashCode(relatedEntity);
}
}