2017-05-06 21 views
1

私の場合、記事とブロックの関係はOneToManyです。つまり、1つの記事に多数のブロックがあることを意味します。そして、私はBlockを管理するためにCascadeType.ALLを使用する記事で、ここにコードがあります。エンティティのIDを取得する方法

@Entity 
public class Article implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    ... 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name = "ARTICLE_ID") 
    private List<Block> blocks; 

    ... 
} 

そして、私は私のブロックの順序を記録したいが、パフォーマンス上の理由で、私は、ArrayListのインデックスを使用するのではなく、現在のブロックのpriorIdに前のブロックのIDを設定し、データベースに永続化しないことを決定します。以下のコードを参照してください。

@Entity 
public class Block implements Serializable { 

    @Id 
    @TableGenerator(name = "BLOCK_ID_GEN", 
     table = "ENTITY_KEY", 
     pkColumnName = "ENTITY_NAME", 
     pkColumnValue = "BLOCK", 
     valueColumnName = "KEY_SEQUENCE", 
     allocationSize = 10) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "BLOCK_ID_GEN") 
    private Long id; 

    ... 

    private Long priorId; 

    ... 
} 

public class BlockUtil { 

    public static List<Block> setPriorId(List<Block> blocks) { 
     List<Block> resultBlocks = new ArrayList<>(); 
     if (!blocks.isEmpty()) { 
      resultBlocks.add(blocks.get(0)); 
      for (int i = 1; i < blocks.size(); i++) { 
       blocks.get(i).setPriorId(blocks.get(i - 1).getId()); 
       resultBlocks.add(blocks.get(i)); 
      } 
     } 
     return resultBlocks; 
    } 
} 

ブロックのIDをデータベースに保持しない限り、私はブロックのIDを知ることができないので、自分のアプローチを主張するとどうなりますか?または私が使用すべきより良いアプローチはありますか?とにかく、私はそれらを順番に欲しい。どうもありがとうございます!

+0

ないことを決定し 。だからあなたは前にIDを得ることができない!明らかにあなたが別の戦略を使用した場合、あなたは持続する前に "id"を持つことができます... –

+1

なぜこれを行うとあなたのパフォーマンスが向上すると思いますか? –

+0

@NeilStocktonその後、TableGeneratorを試しましたが、それでも動作しません。 – MarcuX

答えて

2
  • idにはジェネレータを使用せず、idを自分で設定します(たとえば、シーケンスを使用するなど)。

  • またはモデルを変更してください。 block.priorIdpriorBlock.idに関連付けるのではなく、オブジェクトの理由:block.priorpriorBlockに関連付けます。このようにして、ブロックのIDを知る必要はありませんでした。サイドノートとして

、@Steve Cは、私はまた、あなたがより多くの速度を取得する方法を理解するためにいくつかの困難持って、提案されているよう:

をそして私は、私のブロックの順序を記録したいですパフォーマンスの理由は、私はあなたが挿入したときにのみ割り当てられている「IDENTITY」戦略を使用しているためのArrayListのインデックスを使用するのではなく、現在のブロックのpriorIdに前のブロックの IDを設定するには、

+0

私は主にArrayListを使用し、データテーブルに多数のレコードがある場合、すべてのレコードにINDEXという列があり、ブロックを1つ削除するか、別の位置に移動するか、特定の位置に作成することを主眼とします。他の多くのレコードのINDEXを変更する可能性があります。しかし、私のアプローチはLinkedListのように、レコードのインデックスを変更するだけです。 – MarcuX

+0

私はあなたの必要性を理解していますが、2つの場所(リストとブロックインスタンス)の要素間の関係を処理することは、これらのタスクを2回実行するという制約に注意してください:リストと連鎖オブジェクトで...必要ない場合あなたのエンティティは一貫性がありません。このような状況では、ついにあなたが本当に何かを得ることは確かではありません。 – davidxxx

+0

うわー、そうだね、それらを並べ替えて、データベースからそれらを取り出すときに、新しいArrayListを入れておくべきです。とにかくありがとう、私は二度考えなければならない~~ – MarcuX

関連する問題