Java JPA&x2B;使用联接表或第三个表的一对多和多对一

Java JPA&x2B;使用联接表或第三个表的一对多和多对一,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我试图在查询和响应实体之间建立一对多和多对一关系 public class Query extends IdentifiableEntity { private String complaint; private List<Response> response; //Setter getter } public class Response extends IdentifiableEntity { private String response;

我试图在
查询
响应
实体之间建立
一对多
多对一
关系

public class Query extends IdentifiableEntity {
    private String complaint;
    private List<Response> response;
    //Setter getter
}

public class Response extends IdentifiableEntity {
    private String response;
    private Query query;
    //Setter getter
  }

public abstract class IdentifiableEntity implements Serializable{

    private long id;
    //setter getter
}   
映射配置是

<mapped-superclass class="com.qa.models.IdentifiableEntity">
        <attributes>
            <id name="id">
                <column name="id" nullable="false" column-definition="INT" />
                <generated-value strategy="AUTO" />
            </id>
        </attributes>
    </mapped-superclass>

<entity name="Query" class="com.qa.models.Query" cacheable="false">
        <table name="tbl_query" />
        <attribute-override name="id">
            <column name="query_id" nullable="false" column-definition="INT" />
        </attribute-override>
        <attributes>
            <basic name="complaint">
                <column name="complaint" nullable="false" />
            </basic>

            <one-to-many name="response">
                <join-table name="tbl_map_query_response">
                    <join-column name="query_id" referenced-column-name="query_id" />
                    <inverse-join-column name="response_id" referenced-column-name="response_id" unique="true" />
                </join-table>
                <cascade>
                    <cascade-all />
                </cascade>
            </one-to-many>
        </attributes>
    </entity>


    <entity name="Response" class="com.qa.models.Response" cacheable="false">
        <table name="tbl_response" />
        <attribute-override name="id">
            <column name="response_id" nullable="false" column-definition="INT" />
        </attribute-override>
        <attributes>
            <basic name="response">
                <column name="response_desc" />
            </basic>
            <many-to-one name="query">
                <join-table name="tbl_map_query_response">
                    <join-column name="response_id" referenced-column-name="response_id" />
                    <inverse-join-column name="query_id" referenced-column-name="query_id" unique="true" />
                </join-table>
              <cascade>
                  <cascade-all />
              </cascade>
            </many-to-one>
        </attributes>
    </entity>  


我的问题是,这是建立实体之间关系的正确方式吗?我采用这种方法使应用程序模块化,假设将来
Response
tbl与任何其他表映射。因此,在不改变
Response
的结构的情况下,我如何才能达到要求?

Response表本身不能有查询id吗?当您希望支持两个表之间的多对多关系时,通常会使用联接表(
tbl\u map\u query\u Response
)。您的案例应该是简单的一对多/多对一,因此,您应该能够在
tbl\u response
上有一个查询id外键,然后丢失
tbl\u map\u query\u response
@joy\u jedi::这就是映射查询响应tbl,它被用作映射查询和响应的中间表。@WillKeeling::我采用这种方法使应用程序模块化,假设将来
Response
tbl与任何其他表映射。因此,在不改变
响应结构的情况下
我如何实现需求?
<mapped-superclass class="com.qa.models.IdentifiableEntity">
        <attributes>
            <id name="id">
                <column name="id" nullable="false" column-definition="INT" />
                <generated-value strategy="AUTO" />
            </id>
        </attributes>
    </mapped-superclass>

<entity name="Query" class="com.qa.models.Query" cacheable="false">
        <table name="tbl_query" />
        <attribute-override name="id">
            <column name="query_id" nullable="false" column-definition="INT" />
        </attribute-override>
        <attributes>
            <basic name="complaint">
                <column name="complaint" nullable="false" />
            </basic>

            <one-to-many name="response">
                <join-table name="tbl_map_query_response">
                    <join-column name="query_id" referenced-column-name="query_id" />
                    <inverse-join-column name="response_id" referenced-column-name="response_id" unique="true" />
                </join-table>
                <cascade>
                    <cascade-all />
                </cascade>
            </one-to-many>
        </attributes>
    </entity>


    <entity name="Response" class="com.qa.models.Response" cacheable="false">
        <table name="tbl_response" />
        <attribute-override name="id">
            <column name="response_id" nullable="false" column-definition="INT" />
        </attribute-override>
        <attributes>
            <basic name="response">
                <column name="response_desc" />
            </basic>
            <many-to-one name="query">
                <join-table name="tbl_map_query_response">
                    <join-column name="response_id" referenced-column-name="response_id" />
                    <inverse-join-column name="query_id" referenced-column-name="query_id" unique="true" />
                </join-table>
              <cascade>
                  <cascade-all />
              </cascade>
            </many-to-one>
        </attributes>
    </entity>