就我而言,Article和Block的关系是OneToMany,这意味着一篇文章中有很多块。在文章I中,我使用CascadeType.ALL来管理Block,这是代码。
@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的索引,而是在当前Block的priorId中设置前一个Block的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;
}
}
问题是我无法知道Block的id,除非我坚持他们到数据库,所以如果我坚持我的方法该怎么办?或者我应该使用哪种更好的方法?无论如何,我想要它们。非常感谢你!
答案 0 :(得分:2)
要么不使用生成器作为id,而是自己设置id(例如使用序列)。
或者更改您的模型。不是将block.priorId
与priorBlock.id
相关联,而是根据对象推理:将block.prior
与priorBlock
相关联。通过这种方式,您无需知道要关联的块的ID。
作为旁注,正如@Steve C建议的那样,我也很难理解你将如何获得更快的速度:
我想记录我的Block的顺序,出于性能原因,我 决定不使用ArrayList的索引,而是设置前一个Block id在当前Block的priorId中,