まず第一に、あなたがしたことの説明からは明確ではありませんPlaylistSongs
が、PlaylistId
とを含むテーブルが必要ですSongId
どの曲がどのプレイリストに属しているかを説明しています。
この表では、注文情報を追加する必要があります。
私のお気に入りのメカニズムは実数です。私は最近それを実装しました、そしてそれは魅力のように働きました。曲を特定の位置に移動する場合、前の曲と次の曲の値のOrdering
平均として新しい値を計算しますOrdering
。64ビットの実数を使用すると、地獄が凍結するのとほぼ同時に精度が不足しますが、実際に後世のためにソフトウェアを作成している場合はOrdering
、それぞれの曲すべてに素敵な丸め整数値を再割り当てすることを検討してください時々プレイリスト。
追加のボーナスとして、これを実装したコードを次に示します。もちろん、それをそのまま使用することはできませんし、あなたのためにサニタイズするのは今のところ私には大変な仕事ですので、私はあなたからそれをアイデアを得るために投稿するだけです。
クラスはParameterTemplate
(なんでも聞いてはいけません!)メソッドは、このテンプレートが属するパラメーターテンプレートのリストをその親から取得しますActivityTemplate
。(何でも聞いてはいけません!)このコードには、精度の不足に対する保護が含まれています。除数はテストに使用されます。ユニットテストでは、大きな除数を使用して、精度がすぐになくなるため、精度保護コードをトリガーします。2番目のメソッドはpublicであり、「内部使用のみ。呼び出してはいけない」ので、テストコードで呼び出すことができます。(テストコードは、テストするコードと同じパッケージにないため、パッケージプライベートにすることはできません。)順序を制御するフィールドが呼び出されOrdering
、getOrdering()
およびを介してアクセスされますsetOrdering()
。Hibernateを介してオブジェクトリレーショナルマッピングを使用しているため、SQLは表示されません。
/**
* Moves this {@link ParameterTemplate} to the given index in the list of {@link ParameterTemplate}s of the parent {@link ActivityTemplate}.
*
* The index must be greater than or equal to zero, and less than or equal to the number of entries in the list. Specifying an index of zero will move this item to the top of
* the list. Specifying an index which is equal to the number of entries will move this item to the end of the list. Any other index will move this item to the position
* specified, also moving other items in the list as necessary. The given index cannot be equal to the current index of the item, nor can it be equal to the current index plus
* one. If the given index is below the current index of the item, then the item will be moved so that its new index will be equal to the given index. If the given index is
* above the current index, then the new index of the item will be the given index minus one.
*
* NOTE: this method flushes the persistor and refreshes the parent node so as to guarantee that the changes will be immediately visible in the list of {@link
* ParameterTemplate}s of the parent {@link ActivityTemplate}.
*
* @param toIndex the desired new index of this {@link ParameterTemplate} in the list of {@link ParameterTemplate}s of the parent {@link ActivityTemplate}.
*/
public void moveAt( int toIndex )
{
moveAt( toIndex, 2.0 );
}
/**
* For internal use only; do not invoke.
*/
public boolean moveAt( int toIndex, double divisor )
{
MutableList<ParameterTemplate<?>> parameterTemplates = getLogicDomain().getMutableCollections().newArrayList();
parameterTemplates.addAll( getParentActivityTemplate().getParameterTemplates() );
assert parameterTemplates.getLength() >= 1; //guaranteed since at the very least, this parameter template must be in the list.
int fromIndex = parameterTemplates.indexOf( this );
assert 0 <= toIndex;
assert toIndex <= parameterTemplates.getLength();
assert 0 <= fromIndex;
assert fromIndex < parameterTemplates.getLength();
assert fromIndex != toIndex;
assert fromIndex != toIndex - 1;
double order;
if( toIndex == 0 )
{
order = parameterTemplates.fetchFirstElement().getOrdering() - 1.0;
}
else if( toIndex == parameterTemplates.getLength() )
{
order = parameterTemplates.fetchLastElement().getOrdering() + 1.0;
}
else
{
double prevOrder = parameterTemplates.get( toIndex - 1 ).getOrdering();
parameterTemplates.moveAt( fromIndex, toIndex );
double nextOrder = parameterTemplates.get( toIndex + (toIndex > fromIndex ? 0 : 1) ).getOrdering();
assert prevOrder <= nextOrder;
order = (prevOrder + nextOrder) / divisor;
if( order <= prevOrder || order >= nextOrder ) //if the accuracy of the double has been exceeded
{
parameterTemplates.clear();
parameterTemplates.addAll( getParentActivityTemplate().getParameterTemplates() );
for( int i = 0; i < parameterTemplates.getLength(); i++ )
parameterTemplates.get( i ).setOrdering( i * 1.0 );
rocs3dDomain.getPersistor().flush();
rocs3dDomain.getPersistor().refresh( getParentActivityTemplate() );
moveAt( toIndex );
return true;
}
}
setOrdering( order );
rocs3dDomain.getPersistor().flush();
rocs3dDomain.getPersistor().refresh( getParentActivityTemplate() );
assert getParentActivityTemplate().getParameterTemplates().indexOf( this ) == (toIndex > fromIndex ? toIndex - 1 : toIndex);
return false;
}