如何在WildFly.30.x中用EclipseLink替换Hibernate

问题描述 投票:0回答:1

我们有一个在 Weblogic 中针对 Oracle 数据库运行的 java web 应用程序。我们正在将其从 WebLogic 移植到 Wildfly/JBoss。我们遇到的一个问题是,我们目前使用 EclipseLink 作为 JPA 提供程序,当我们尝试使用开箱即用的 Hibernate JPA 直接移植到 Wildfly 时,我们遇到了一个又一个问题(持久性顺序、我们不这样做的更新)不想要,现有数据库触发器的问题等) 因此,我们并没有试图与之抗争,而是认为我们应该能够用 EclipseLink 替换 Hibernate 作为 JPA 提供者,但我有点陷入困境,我可以在哪里寻找一些文档,更重要的是寻找示例。 所以想看看是否有人做过这一点以及任何指针、参考资料等。

Web 应用程序正在使用 Maven 构建,我们也从“javax.”切换到“jakarta.”(不确定这是否有任何区别)。

谢谢!

我们一直在修改 EclipseLink 特定注释,并且发现我们需要添加其他注释才能使 Hibernate 正常工作。例如:

  1. 以前我们可以通过“entityManager.find()”获取实体。但在 Hibernate 中,每次我们查看实体时,它都会开始更新实体“@Version”,但在 WebLogic/EclipseLink 下它并没有这样做。这导致我们在将实体更新回数据库时出现问题。我们通过分离我们得到的东西来解决这个问题。但在某些情况下,我们需要它保持附着,这会成为一个非常复杂的改变。

  2. 即使值是数字,我们也将 @Id 定义为 String 而不是 Long 的实体。此注释适用于 EclipseLink: @ID @SequenceGenerator(名称=“ITEM_SEQ_GEN”,序列名称=“LIN_DBUID_SEQ”,allocationSize = 1) @GenerateValue(策略 = GenerationType.SEQUENCE, 生成器 = "ITEM_SEQ_GEN") @Column(名称 = "ITEM_ID") 公共字符串 getId() { 返回ID; }

    公共无效setId(字符串id){ 这个.id = id; }

但是在 Hibernate 中,@SequenceGenerator 不喜欢我们使用 String 类型,我们需要将其更改为这样才能工作: @ID @Column(名称 = "ITEM_ID") 公共字符串 getId() { 返回ID; }

public void setId(String id) {
    this.id = id;
}

// #hibernate
// it seem Hibernate required the SEQUENCE gen to set numeric value but
// we store the Policy ID as string, so we need to do this gymnastic to
// map a numeric to a String
@Transient
private static final String SEQUENCE_NAME = "LIN_DBUID_SEQ";

@PrePersist
public void generateId() {
    // only if I need a new ID!
    if (null == this.getId())
        this.setId(generateId(SEQUENCE_NAME));
}

public static String generateId(String sequenceName) {
    Model model = JndiUtil.lookup(Model.JNDI_NAME);
    EntityManager entityManager = model.getEm(); // Obtain the EntityManager
    Query query = entityManager.createNativeQuery("SELECT " + sequenceName + ".NEXTVAL FROM DUAL");
    BigDecimal result = (BigDecimal) query.getSingleResult();
    return result.toString();
}

还有更多,我们开始觉得这些对于简单的移植来说不是必需的!

hibernate jpa wildfly eclipselink
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.