我是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”我想通过哪个表来映射实体。是这样,这是否意味着实体只能映射到数据库中的一个表?表注释是否与类名有任何关系?
答案 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;
}