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

JPA,实体、表和类名之间的关系,jpa,glassfish-4,java-ee-7,Jpa,Glassfish 4,Java Ee 7,我是JPA的新手,有一个关于命名的问题 我最近遇到了一些麻烦,在我的持久化单元中有两个同名的实体。(我很愚蠢,没有保存错误消息) 我正在制作一个web应用程序(javaee7,Glassfish),它使用API(uniprotjapi)连接到远程数据库。API类似乎包含一个名为“Protein”的实体。问题是我有一个本地数据库,我想为它编写一些实体类,其中一个叫做“Protein”,因为我本地数据库中的表叫做“Protein”。这似乎导致命名与外部衍生的“蛋白质”实体发生冲突。我想最简单的方法就

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

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

我正在制作一个web应用程序(javaee7,Glassfish),它使用API(uniprotjapi)连接到远程数据库。API类似乎包含一个名为“Protein”的实体。问题是我有一个本地数据库,我想为它编写一些实体类,其中一个叫做“Protein”,因为我本地数据库中的表叫做“Protein”。这似乎导致命名与外部衍生的“蛋白质”实体发生冲突。我想最简单的方法就是重命名我的本地蛋白质实体

但我不知道该怎么做

我猜是这样做的:

@Entity(name="MyProtein")
@Table(name="protein")
public Class MyProtein { 
因为我认为@Entity注释中的name=“MyProtein”将设置实体名称。是这样吗?这是否必须与类名相同


以及@Table注释中的name=“protein”设置了映射实体的表。这是否意味着一个实体只能映射到数据库中的一个表?表注释是否与类名有任何关系?

@Entity
可以。您不需要在其中使用
name

使用
@Table
实体,可以通过
名称
值将表与实体映射


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

在给定的示例中,的name属性没有任何区别。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(默认值),数据库表的名称也是MyProtein
  • b.MyProtein
    的实体名称是SomethingElse,数据库表的名称也是SomethingElse
当需要使用默认表名以外的其他表名时,可以使用。API文档解释属性及其默认值

实体的持久属性可以划分为多个表,但每个实体只有一个主表,一个属性只存储到一个表中。辅助表是用指定的。当有很多这样的人时,我们来看看这幅图。若属性应该存储到辅助表中,则表的属性中给出了表的名称

也许通过示例可以更清楚地看到这一点:

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

}