【问题标题】:JPA, relationship between entity, table and class nameJPA,实体、表和类名之间的关系
【发布时间】:2014-02-16 15:30:57
【问题描述】:

我是 JPA 的新手,有一个关于命名的问题。

我最近遇到了一些麻烦,在我的持久性单元中有两个同名的实体出现类似这样的错误。 (我傻了,没有保存错误信息)

我正在制作一个使用 API (UniProt JAPI) 连接到远程数据库的 Web 应用程序(Java EE 7,Glassfish)。 API 类似乎包含一个名为“蛋白质”的实体。问题是我有一个本地数据库,我想为其编写一些实体类,其中一个被称为“蛋白质”,因为我本地数据库中的表被称为“蛋白质”。这似乎导致与外部派生的“蛋白质”实体的命名冲突。我认为最简单的解决方法是重命名我的本地蛋白质实体。

但我不确定该怎么做。

我猜是这样的:

@Entity(name="MyProtein")
@Table(name="protein")
public Class MyProtein { 

因为我认为 @Entity 注释中的 name="MyProtein" 将设置实体名称。是这样吗?这必须与类名相同吗?

@Table 注释中的 name="protein" 我想从哪个表中映射实体。是这样吗?这是否意味着一个实体只能映射到数据库中的一个表?表注解和类名有关系吗?

【问题讨论】:

    标签: jpa glassfish-4 java-ee-7


    【解决方案1】:

    @Entity 很好。你不需要在里面使用name

    使用@Table 实体,您可以通过name 值将表与您的实体进行映射。

    对于 JPA 项目,您可以让一个实体仅指向一个表。而且,逻辑上多个实体可以指向一个表(我从未使用过这样的东西)。

    【讨论】:

      【解决方案2】:

      在给定的示例中,@Entity 的名称属性没有区别。名称默认为实体类的非限定名称,在这种情况下相同。当不同包中有两个同名实体类时,这个属性就派上用场了:

      package a;
      
      @Entity
      public class MyProtein { ... }
      
      
      package b;
      //for this one we override default name (MyProtein)
      @Entity (name = "SomethingElse")
      public class MyProtein { ... }
      

      需要重命名第二个实体,因为我们不能有多个同名实体。

      表名默认为实体名。

      • a.MyProtein 的实体名称是 MyProtein(默认),数据库表的名称也是如此。
      • b.MyProtein 的实体名称是 SomethingElse,数据库表的名称也是如此

      当需要使用默认表名以外的其他表名时,可以使用@Table。 API 文档解释了属性及其默认值。

      实体的持久属性可以划分为多个表,但每个实体只有一个主表,一个属性只存储在一个表中。辅助表使用@SecondaryTable 指定。当它们很多时,@SecondaryTables 就会出现。如果属性应该存储到辅助表中,表的名称在@Columnname 属性中给出

      也许这通过示例更清楚:

      //overrides default MyProtein
      @Entity(name="SomeEntity")
      //overrides default SomeEntity (default is entity name, not the name of class)
      @Table(name="protein")
      @SecondaryTables({
          @SecondaryTable(name="more_protein_attributes"),
          @SecondaryTable(name="and_even_more")
      })
      public class MyProtein {
         @Id private Integer id;
         //attribute to be stored to to 'protein' table
         private String attr1;
      
         @Column(table = "more_protein_attributes")
         private String attr2;
      
         @Column(table = "and_even_more")
         private String attr3;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 2012-01-06
        相关资源
        最近更新 更多