如何在jpa中映射Map <string,myvalueobject =“”>和xml?

时间:2017-12-28 10:29:31

标签: java xml hibernate jpa

要将我的域模型与持久性机制分离,我使用XML来配置从我的域模型到数据库实体的映射。 我有这个实体:

public class Tenant {
   long id;
   Map<String, AuthApp> authApps;
   ...
}

这个值对象:

public class AuthApp {
   String authCode;
   int durationInDays;
   ...
}

价值对象本身没有生命周期,它取决于实体。 我在我的RDBMS中创建了两个表,&#34;租户&#34;和&#34; auth_app&#34;。 任何人都可以指导我如何为这种情况编写JPA xml吗? 我到目前为止编码的XML是这样的:

<entity class="Tenant">
  <table name="tenant"/>
  <attributes>
    <id name="id"><generated-value strategy="AUTO" /></id>
    <element-collection name="authApp">
      <map-key name="app_id"/>
      <collection-table name="auth_app">
        <join-column name="tenant_id" referenced-column-name="id"/>
      </collection-table>
    </element-collection>
  </attributes>
</entity>

我不知道它是否正确,以及如何继续。

顺便说一句,我使用hibernate作为JPA提供程序。

1 个答案:

答案 0 :(得分:0)

解决!感谢DN1的评论,我已经意识到“价值对象”是JPA语义中的“可嵌入”。因此,将“AuthApp”定义为“可嵌入”,使用“map-key-column”而不是“map-key”,完成。 整件事情是这样的:

<entity class="Tenant">
  <table name="tenant"/>
  <attributes>
    <id name="id"><generated-value strategy="AUTO" /></id>
    <element-collection name="authApp" target-class="AuthApp">
      <map-key-column name="app_id"/>
      <collection-table name="auth_app">
        <join-column name="tenant_id" referenced-column-name="id"/>
      </collection-table>
    </element-collection>
  </attributes>
</entity>
<embeddable class="AuthApp">
   <attributes>
       ......
   </attributes>
</embeddable>
......