Java 如何获取实体';你的身份证是什么?
在我的例子中,Article和Block的关系是OneToMany,这意味着一篇文章中有许多Block。在本文中,我使用CascadeType.ALL来管理块,下面是代码Java 如何获取实体';你的身份证是什么?,java,jpa,jakarta-ee,Java,Jpa,Jakarta Ee,在我的例子中,Article和Block的关系是OneToMany,这意味着一篇文章中有许多Block。在本文中,我使用CascadeType.ALL来管理块,下面是代码 @Entity public class Article implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ... @OneToMan
@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;
...
}
@实体
公共类文章实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
...
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“ARTICLE\u ID”)
私有列表块;
...
}
我想记录我的块的顺序,出于性能原因,我决定不使用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;
}
}
@实体
公共类块实现可序列化{
@身份证
@TableGenerator(name=“BLOCK\u ID\u GEN”,
table=“实体密钥”,
pkColumnName=“实体名称”,
pkColumnValue=“BLOCK”,
valueColumnName=“按键顺序”,
allocationSize=10)
@GeneratedValue(策略=GenerationType.TABLE,generator=“BLOCK\u ID\u GEN”)
私人长id;
...
私人长priorId;
...
}
公共类BlockUtil{
公共静态列表setPriorId(列表块){
List resultBlocks=new ArrayList();
如果(!blocks.isEmpty()){
resultBlocks.add(blocks.get(0));
对于(int i=1;i
问题是除非我将它们持久化到数据库中,否则我无法知道块的id,所以如果我坚持我的方法,我应该怎么做?或者我应该用什么更好的方法?不管怎样,我希望他们井然有序。非常感谢你 - 或者不要为id使用生成器,而是自己设置id(例如,通过使用序列)
- 或者改变你的模式。与其将
与block.priorId
关联,不如根据对象进行推理:将priorBlock.id
与block.prior
关联。这样,您就不需要知道块的id来关联它们priorBlock
由于您使用“标识”策略,因此只有在插入时才分配该策略。因此,您无法在持久化之前获取id!显然,如果你使用了不同的策略,那么你可以在坚持之前获得“id”……为什么你认为这样做会提高你的性能?@NeilStockton我然后尝试了TableGenerator,但仍然不起作用……“不起作用”:真的是描述性的。表策略将设置为persist,但在INSERT之前,所以您可以在prePersist中拦截。这就是调试涉及的地方,而不是说“不起作用”。另外,如果您只是希望在调用em.persist之前分配“id”,那么请在JPA遇到类之前解释JPA将如何参与该类API@SteveC我主要考虑如果我使用ARARYLIST,并且在我的数据表中有很多记录,每个记录都有一个名为index的列,然后我删除一个块或将其移动到另一个位置或在特定位置创建它,在某些情况下,它可能会导致许多其他记录的索引发生更改,对吗?但是我的方法就像一个链接表,它只会改变一些记录的索引。我主要考虑如果我使用ARARYLIST,并且在我的数据表中有很多记录,每个记录都有一个名为index的列,然后我删除一个块或者把它移到另一个位置或者在特定的位置创建它。在某些情况下,它可能会导致许多其他记录的索引发生更改,对吗?但我的方法就像LinkedList,它只会更改一些记录的索引。我理解您的需要,但要小心,因为处理两个位置(列表和块实例)的元素之间的关系会迫使您执行两次这些任务:在列表中和在链接对象中。。。如果您不希望您的实体不一致。在这种情况下,我不确定最终您是否会获得真正的收益。哇,您是对的,我应该对它们重新排序,然后在从数据库检索它们时放入一个新的ArrayList。无论如何谢谢你,我应该三思而后行~~