我们有一个在 Weblogic 中针对 Oracle 数据库运行的 java web 应用程序。我们正在将其从 WebLogic 移植到 Wildfly/JBoss。我们遇到的一个问题是,我们目前使用 EclipseLink 作为 JPA 提供程序,当我们尝试使用开箱即用的 Hibernate JPA 直接移植到 Wildfly 时,我们遇到了一个又一个问题(持久性顺序、我们不这样做的更新)不想要,现有数据库触发器的问题等) 因此,我们并没有试图与之抗争,而是认为我们应该能够用 EclipseLink 替换 Hibernate 作为 JPA 提供者,但我有点陷入困境,我可以在哪里寻找一些文档,更重要的是寻找示例。 所以想看看是否有人做过这一点以及任何指针、参考资料等。
Web 应用程序正在使用 Maven 构建,我们也从“javax.”切换到“jakarta.”(不确定这是否有任何区别)。
谢谢!
我们一直在修改 EclipseLink 特定注释,并且发现我们需要添加其他注释才能使 Hibernate 正常工作。例如:
以前我们可以通过“entityManager.find()”获取实体。但在 Hibernate 中,每次我们查看实体时,它都会开始更新实体“@Version”,但在 WebLogic/EclipseLink 下它并没有这样做。这导致我们在将实体更新回数据库时出现问题。我们通过分离我们得到的东西来解决这个问题。但在某些情况下,我们需要它保持附着,这会成为一个非常复杂的改变。
即使值是数字,我们也将 @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();
}
还有更多,我们开始觉得这些对于简单的移植来说不是必需的!
您应该阅读文档: https://docs.wildfly.org/31/Developer_Guide.html#migration-from-eclipselink 或者,如果您想将序列生成为字符串: 有没有办法使用带前缀的@GenerateValue创建字符串序列?