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>