Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hibernate JPA读取时的复合外键问题_Hibernate_Jpa 2.0_Hibernate Mapping - Fatal编程技术网

hibernate JPA读取时的复合外键问题

hibernate JPA读取时的复合外键问题,hibernate,jpa-2.0,hibernate-mapping,Hibernate,Jpa 2.0,Hibernate Mapping,我正在使用Hibernate JPA、EnterpriseDB(PostgresPlus Advanced Server 9.2.1.3)和Jboss 7.1.1 Final,在读取具有复合主键和(一对一)外键链接到另一个实体的实体时收到异常 我准备了一个项目来展示这个案例。单击以下载示例项目文件。 注意:该文件将在未来7天内在服务器上可用。如果需要,我可以上传文件并更改链接 我尝试读取实体列表,将复合主键的一列与参数匹配 public List<TableA> getComposi

我正在使用Hibernate JPA、EnterpriseDB(PostgresPlus Advanced Server 9.2.1.3)和Jboss 7.1.1 Final,在读取具有复合主键和(一对一)外键链接到另一个实体的实体时收到异常

我准备了一个项目来展示这个案例。单击以下载示例项目文件。 注意:该文件将在未来7天内在服务器上可用。如果需要,我可以上传文件并更改链接

我尝试读取实体列表,将复合主键的一列与参数匹配

public List<TableA> getComposites(String key) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<TableA> query = cb.createQuery(TableA.class);

    Root<TableA> aEntity = query.from(TableA.class);
    aEntity.fetch(TableA_.tableB, JoinType.LEFT);

    query.where(cb.equal(aEntity.get(TableA_.id).get(TableAPK_.colA), key));

    query.select(aEntity).distinct(true);

    try {
        return em.createQuery(query).getResultList();
    } catch (NoResultException ignore) {
        return null;
    }
}
表A和表B具有一对一链接,该链接具有复合主键(col_A、col_B、col_c),共享相同的列名。表B的主键也是表A主键的外键

@Embeddable
public class TableAPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;

@Column(name="col_a")
private String colA;

@Column(name="col_b")
private String colB;

@Column(name="col_c")
private String colC;


@Entity
@Table(name="table_a")
public class TableA implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private TableAPK id;

@Column(name="col_ex_d")
private String colExD;

//bi-directional one-to-one association to TableB
@OneToOne(mappedBy="tableA", fetch=FetchType.LAZY)
private TableB tableB;


@Embeddable
public class TableBPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;

@Column(name="col_a")
private String colA;

@Column(name="col_b")
private String colB;

@Column(name="col_c")
private String colC;


@Entity
@Table(name="table_b")
public class TableB implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private TableBPK id;

@Column(name="col_ex_d")
private Integer colExD;

@Column(name="col_ex_e")
private String colExE;

@Column(name="col_ex_f")
private Boolean colExF;

//bi-directional one-to-one association to TableA
@OneToOne(fetch=FetchType.LAZY)
@PrimaryKeyJoinColumns({
    @PrimaryKeyJoinColumn(name="col_a", referencedColumnName="col_a"),
    @PrimaryKeyJoinColumn(name="col_b", referencedColumnName="col_b"),
    @PrimaryKeyJoinColumn(name="col_c", referencedColumnName="col_c")
    })
private TableA tableA;
如果您想在本地进行测试:Project有一个liquibase配置来创建表,甚至插入示例数据本身(
compositepersistence/src/main/liquibase
)。您可以检查
changelog.xml
文件以创建表以及主键和外键。但是我没有在包中包含连接属性文件。如果您想在本地运行项目,我可以尝试帮助您设置环境。要进行测试,只需在部署后在浏览器上调用servlet即可

/composite-web/Composite?myKey=a1

如果您想使用eclipselink进行测试,只需在
复合持久性/src/resources/META-INF/persistence.xml
上激活提供程序和属性(它们被注释为使用Jboss:Hibernate的默认JPA提供程序;您需要在Jboss服务器上配置eclipselink模块)。顺便说一句,实体的设置与eclipselink一起工作。

由于
TableAPK
TableBPK
是相等的(具有完全相同的结构),因此您可以删除其中一个并在任何地方使用另一个

我的意思是:删除
TableBPK
,重命名
TableAPK
do
TablePK
,并在任何地方使用它

表格a
制作成这样:

@Entity
@Table(name="table_a")
public class TableA implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private TablePK id; //<- this line changed from TableAPK to TablePK
...

query.where
行中尝试
TableA_uu2;tableB.id
。@acdcjunior,我已经按照建议更改了where条件:
query.where(cb.equal(aEntity.get(TableA_2;.tableB).get(tableB_2;.id).get(TableBPK_2;.colA),key))但结果是相同的
org.hibernate.TypeMismatchException:为类org.test.hibernate.persistence.entity.TableB提供了错误类型的id。预期:class org.test.hibernate.persistence.entity.TableBPK,get class org.test.hibernate.persistence.entity.TableAPK
@Entity
@Table(name="table_a")
public class TableA implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private TablePK id; //<- this line changed from TableAPK to TablePK
...
@Entity
@Table(name="table_b")
public class TableB implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private TablePK id; //<- this line changed from TableBPK to TablePK