public static void BindFk(PersistentClass referencedEntity,
		                          PersistentClass destinationEntity,
		                          Ejb3JoinColumn[] columns,
		                          SimpleValue value,
		                          bool unique,
		                          ExtendedMappings mappings)
		{
			throw new NotImplementedException();
		}
		public ToOneFkSecondPass(ToOne value,
		                         Ejb3JoinColumn[] columns,
		                         bool unique,
		                         string entityClassName,
		                         string path,
		                         ExtendedMappings mappings) : base(value, columns)
		{
			this.mappings = mappings;
			this.unique = unique;
			this.entityClassName = entityClassName;
			this.path = entityClassName != null ? path.Substring(entityClassName.Length + 1) : path;
		}
		public FkSecondPass(ToOne value, Ejb3JoinColumn[] columns)
		{
			this.value = value;
			this.columns = columns;
			uniqueCounter = globalCounter.GetAndIncrement();
		}
 	public static void CreateSyntheticPropertyReference(Ejb3JoinColumn[] columns, PersistentClass @ref, object o, ManyToOne one, bool b, ExtendedMappings mappings)
 	{
 		throw new System.NotImplementedException();
 	}
		private void BindJoinToPersistentClass(Join join, Ejb3JoinColumn[] ejb3JoinColumns)
		{
			SimpleValue key = new DependantValue(join.Table, persistentClass.Identifier);
			join.Key = key;
			SetFKNameIfDefined(join);
			key.IsCascadeDeleteEnabled = false;
			TableBinder.BindFk(persistentClass, null, ejb3JoinColumns, key, false, mappings);
			join.CreatePrimaryKey(dialect);
			join.CreateForeignKey();
			persistentClass.AddJoin(join);
		}
		private void CreatePrimaryColumnsToSecondaryTable(object uncastedColumn, IPropertyHolder propertyHolder, Join join)
		{
			Ejb3JoinColumn[] ejb3JoinColumns;
			PrimaryKeyJoinColumnAttribute[] pkColumnsAnn = null;
			JoinColumnAttribute[] joinColumnsAnn = null;
			if (uncastedColumn is PrimaryKeyJoinColumnAttribute[])
			{
				pkColumnsAnn = (PrimaryKeyJoinColumnAttribute[])uncastedColumn;
			}
			if (uncastedColumn is JoinColumnAttribute[])
			{
				joinColumnsAnn = (JoinColumnAttribute[])uncastedColumn;
			}
			if (pkColumnsAnn == null && joinColumnsAnn == null)
			{
				ejb3JoinColumns = new Ejb3JoinColumn[1];
				ejb3JoinColumns[0] = Ejb3JoinColumn.BuildJoinColumn(
						null,
						null,
						persistentClass.Identifier,
						secondaryTables,
						propertyHolder, mappings
				);
			}
			else
			{
				int nbrOfJoinColumns = pkColumnsAnn != null ?
						pkColumnsAnn.Length :
						joinColumnsAnn.Length;
				if (nbrOfJoinColumns == 0)
				{
					ejb3JoinColumns = new Ejb3JoinColumn[1];
					ejb3JoinColumns[0] = Ejb3JoinColumn.BuildJoinColumn(
							null,
							null,
							persistentClass.Identifier,
							secondaryTables,
							propertyHolder, mappings
					);
				}
				else
				{
					ejb3JoinColumns = new Ejb3JoinColumn[nbrOfJoinColumns];
					if (pkColumnsAnn != null)
					{
						for (int colIndex = 0; colIndex < nbrOfJoinColumns; colIndex++)
						{
							ejb3JoinColumns[colIndex] = Ejb3JoinColumn.BuildJoinColumn(
									pkColumnsAnn[colIndex],
									null,
									persistentClass.Identifier,
									secondaryTables,
									propertyHolder, mappings
							);
						}
					}
					else
					{
						for (int colIndex = 0; colIndex < nbrOfJoinColumns; colIndex++)
						{
							ejb3JoinColumns[colIndex] = Ejb3JoinColumn.BuildJoinColumn(
									null,
									joinColumnsAnn[colIndex],
									persistentClass.Identifier,
									secondaryTables,
									propertyHolder, mappings
							);
						}
					}
				}
			}

			foreach (Ejb3JoinColumn joinColumn in ejb3JoinColumns)
			{
				joinColumn.ForceNotNull();
			}
			BindJoinToPersistentClass(join, ejb3JoinColumns);
		}