JPA,实体,表和类名之间的关系

时间:2014-01-25 16:18:49

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

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

我最近遇到了一些麻烦,我遇到的错误是在我的持久性单元中有两个具有相同名称的实体。 (我是愚蠢的,没有保存错误信息)

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

但我不确定如何做到这一点。

我的猜测是做这样的事情:

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

因为我认为@Entity注释中的名称=“MyProtein”将设置实体名称。是这样,这是否必须与班级名称相同?

@Table注释中的name =“protein”我想通过哪个表来映射实体。是这样,这是否意味着实体只能映射到数据库中的一个表?表注释是否与类名有任何关系?

2 个答案:

答案 0 :(得分:0)

@Entity没问题。您无需在其中使用name

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

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

答案 1 :(得分:0)

在给定的示例中,@Entity的名称属性没有区别。 Name默认为实体类的非限定名称,在这种情况下相同。当两个实体类在不同的包中具有相同的名称时,此属性很方便:

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就会出现。如果属性应存储到辅助表,则表的名称在name@Column属性中给出

通过示例可能会更清楚:

//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;

}