如何在持久化之前获取实体的ID?

时间:2017-05-06 08:33:40

标签: java jpa java-ee

就我而言,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,除非我坚持他们到数据库,所以如果我坚持我的方法该怎么办?或者我应该使用哪种更好的方法?无论如何,我想要它们。非常感谢你!

1 个答案:

答案 0 :(得分:2)

  • 要么不使用生成器作为id,而是自己设置id(例如使用序列)。

  • 或者更改您的模型。不是将block.priorIdpriorBlock.id相关联,而是根据对象推理:将block.priorpriorBlock相关联。通过这种方式,您无需知道要关联的块的ID。

作为旁注,正如@Steve C建议的那样,我也很难理解你将如何获得更快的速度:

  

我想记录我的Block的顺序,出于性能原因,我   决定不使用ArrayList的索引,而是设置前一个Block   id在当前Block的priorId中,