2017-05-06 26 views
1

就我而言,Article和Block的關係是OneToMany,這意味着在一篇文章中有很多Block。在文章中我使用CascadeType.ALL來管理Block,這裏是代碼。如何在持續之前獲取實體的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的索引,但設置先前塊的ID在當前塊的priorId,然後堅持到數據庫中。請參閱下面的代碼。

@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,除非我堅持他們到數據庫,所以如果我堅持我的做法,我該怎麼辦?或者我應該使用更好的方法?無論如何,我想要他們。非常感謝!

+0

。所以你不能在堅持之前獲得ID!顯然,如果你使用了不同的策略,那麼你可以在持續之前擁有「id」... –

+1

爲什麼你認爲這樣做會提高你的表現? –

+0

@NeilStockton然後我嘗試了TableGenerator,但仍然無法正常工作.... – MarcuX

回答

2
  • 要麼不爲ID使用生成器,而要自己設置ID(例如通過使用序列)。

  • 或者改變你的模型。而不是將block.priorIdpriorBlock.id關聯起來,原因在於Object:關聯block.priorpriorBlock。通過這種方式,你不需要知道塊的ID來關聯它們。

作爲一個側面說明,作爲@Steveç的建議,我也有一些困難,瞭解你將如何獲得更快的速度:

我想記錄我的塊的順序,性能原因,我 決定不使用ArrayList的指數,但由於您使用「身份」策略,那麼當您插入只分配給設置先前塊的 ID在當前塊的priorId,

+0

我主要考慮如果我使用ArrayList,並且在我的數據表中有很多記錄,那麼每個記錄都有一個名爲INDEX的列,然後我刪除一個塊或將其移動到另一個位置或創建它在特定的位置。可能會導致很多其他記錄'INDEX被改變,對吧?但我的方法就像一個LinkedList,它只會改變一些記錄的INDEX。 – MarcuX

+0

我明白你的需要,但要小心處理兩個地方(列表和你的Block實例)的元素之間的關係,你需要做兩次這些任務:在列表和鏈接對象中......如果你不想要你的實體不一致。在這些情況下,我不確定最終你會獲得什麼。 – davidxxx

+0

哇,你說得對,我應該對它們重新排序,然後在我從數據庫中檢索它們時放入一個新的ArrayList。無論如何,謝謝你,我應該三思~~ – MarcuX

相關問題