【问题标题】:EcllipseLink: JPA Entities with same name. Error: Entity name must be unique in a persistence unitEcllipseLink:具有相同名称的 JPA 实体。错误:实体名称在持久性单元中必须是唯一的
【发布时间】:2014-04-17 02:33:04
【问题描述】:

我正在将代码从 EJB2 迁移到 EJB3。我已将 POJO 转换为 JPA 实体。很少有实体具有相同的名称,例如 @Entity(name="myentity1")。我在部署时遇到错误“实体名称在持久性单元中必须是唯一的”。发生这种情况是因为模块依赖于具有相同名称的实体的其他模块。是否有任何方法可以在使用时(SessionCustomizer 或任何其他方式)中断它并每次动态更新名称?我现在无法更改实体名称,因为实体名称被广泛使用。我正在使用 EcllipseLink 2.5

示例代码

EJB Module1(依赖于 EJB Module2)

package com.my.module1.package1;

@javax.persistence.Entity(name = "myentity1")
@Table(name = "TABLE1")
public class MyEntity1
    implements Serializable {

    @Column(name = "ID")
    private Long Id;

    public Long getId() {
    return Id;
  }

  public void setId(Long Id) {
    this.Id = Id;
  }
}

// EJB 模块2

package com.my.module2.package2;

@javax.persistence.Entity(name = "myentity1")
@Table(name = "TABLE1")
public class MyEntity1
    implements Serializable {

    @Column(name = "ID")
    private Long Id;

    public Long getId() {
    return Id;
  }

  public void setId(Long Id) {
    this.Id = Id;
  }
}

任何帮助将不胜感激。

【问题讨论】:

  • 它们在持久化单元中必须是唯一的,以便名称可以识别哪些类和表将用于查询。不过,您的软件包可能应该进入它们自己的持久性单元,而不是将它们全部组合在一起。或者您可以使用 orm.xml 覆盖实体注释。

标签: jpa eclipselink jpa-2.0 ejb-3.0


【解决方案1】:

仅将注释(@Table(name = "TABLE1"))保留在您用于通过EntityManager 持久化到数据库中的注释之上。并从他人身上移除。您的实体名称在 persistence unit 中必须是唯一的。

【讨论】:

  • Vaiya,同样的问题发生在我这边,当我重构并将数据库实体从一个包移动到另一个包时。使用 clean-build 操作重新启动我的 IDE 后,一切都像幻影故事一样解决了。
【解决方案2】:

是的,有办法。在persistence.xml中,你可以定义你自己的Persistence Unit,还有一个你想在你的Persistence Unit中拥有的类的列表,还有一个xml标签

<exclude-unlisted-classes>true</exclude-unlisted-classes>

以上将禁止添加任何其他未列出的实体类,其他类不会添加到persistenceUnit中,我认为这将解决碰撞问题。

只需使用&lt;class&gt; 和上面的标签来配置你所有的持久化单元。

【讨论】:

  • 感谢您的回复。有没有办法排除列出的课程?因为我有一长串需要包含在持久性单元中的类,但有一小部分需要排除的类。或者我们可以在 标记中使用正则表达式吗?
  • 我认为那里不允许使用正则表达式,在 xsd 中并没有说明任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多