JPA-@OneToMany作为地图 - java

这似乎很普通,但是作为JPA新手,我很难弄清楚这一点。我正在使用EclipseLink和PostgreSQL,但这应该只与JPA规范有关。

我有一个表PRIMARY,它具有一个ID,然后有一堆其他列。还有另一个表SECONDARY,它在PRIMARY表中也有一个外键,也称为ID。该SECONDARY表具有该ID和代表区域设置的varchar的复合键。

因此,在Primary实体中,我想要一个类型为Map<String, Secondary>的字段,其中键是SECONDARY表中的语言环境字符串,而条目是Secondary实体。我的Secondary类如下所示:

@Entity
public class Secondary
{
     @Id
     private Long id;
     @Id
     private String locale;
     private String str1;
     private String str2;
     .....
}

我以为我想使用@MapKeyJoinColumn注释,但似乎无法使其他注释正常工作。我尝试了这个:

@OneToMany
@JoinColumn(name="ID")
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这导致它试图选择一个不存在的名为secondaryByLocale_key的列。

然后我尝试了这个:

@OneToMany
@JoinTable(name="SECONDARY", 
        joinColumns={@JoinColumn(name="ID")},
        inverseJoinColumns=@JoinColumn(name="ID"))
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这将导致以下错误:

Exception Description: The @JoinColumns on the annotated element [field secondaryByLocale] from the entity class [class com.foo.Primary] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.

我尝试将referencedColumnName添加到注释中(我不确定它应该是什么),但是我遇到了同样的错误。

根据建议,我尝试使用@MapKey,如下所示:

@OneToMany
@JoinColumn(name="ID")
@MapKey(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这将导致以下错误:

Exception Description: The map key [LOCALE] on the entity class [class com.foo.Secondary] could not be found for the mapping [org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping[secondaryByLocale]].

也许我要解决所有这些错误,并且有一种更好的方法来注释“地图”字段。任何帮助将非常感激。

参考方案

尝试改用@MapKey(name = "locale")

当您的地图关键字是一个实体时,将使用@MapKeyJoinColumn,但此处您仅使用语言环境字符串。

JAVA JPA错误401:“需要完全身份验证才能访问此资源” - java

我正在使用从C#应用程序调用的JAVA JPA API。 C#-> JAVA API调用方法由OpenAPI-generator生成。我使用Oauth2进行身份验证。调用我获得访问令牌后,C#-> Oauth2似乎工作正常,但是在发送GET请求(或任何其他需要身份验证的请求)时,出现错误“需要完全身份验证才能访问此资源”。邮递员-> Oau…

将自己的方法应用于h2 - java

我已经开始学习Spring,并且正在尝试将电影的标题,类型,年份和演员数据存储在数据库(h2)中。如何使用我自己的代码中的方法从该数据库中获取数据,以使用system.out.println()在控制台中将其打印出来?我有Movie和Actor的类及其相应的属性,都用@Entity批注标记。接下来,我有一个扩展JpaRepository的接口(我知道有找到所…

JPA:回滚后刷新分离的实体并重新附加它 - java

我有一个方法可以接收JPA Entity及其相关的EntityManager作为参数。 Entity实例不是在类内部创建的,它很可能与其他类(如GUI等)共享。该方法启动事务,对实体进行一些更改,最后提交事务。万一提交失败,将调用EntityTransaction.rollback():根据JPA规范,然后将实体与管理器分离。万一发生故障,应用程序需要丢弃待…

从实体获取或创建插入语句 - java

是否存在具有值的现有实体类生成插入语句的可能性?编辑:我的意思是为实体类的实例生成一个插入语句,以单独执行该语句。提前致谢 java大神给出的解决方案 使用Fastnate,您可以为没有连接数据库的实体创建SQL语句:public String createSQL() { // Create your entity TestEntity entity = n…

如何将HQL中的引用实体强制转换为其子类 - java

假设存在以下实体(未编写JPA注释):class Questionnaire { ... } class Policy { private Questionnaire questionnaire; ... } class LifeQuestionnaire extends Questionnaire { private String someField; }…