具有给定标识符的多个行被发现为复合键的例外

时间:2014-02-24 08:45:16

标签: spring hibernate java-ee jpa jpa-2.0

我正在使用带有旧数据库的JPA / Hibernate开发Web应用程序。 我将下面的表与underlying_id和value_date作为复合键,其中underlying_id也是一个外键

CREATE TABLE `underlying_settle_value_table` (
  `underlying_id` varchar(250) NOT NULL,
  `value_date` date NOT NULL,
  `settle_value` double NOT NULL,
  `risk_free_rate` double NOT NULL,
  `div_yield` double NOT NULL,
  PRIMARY KEY (`underlying_id`,`value_date`),
  KEY `fk_underlying_settle_value_table_underlying_list_table1_idx` (`underlying_id`),
  CONSTRAINT `fk_underlying_settle_value_table_underlying_list_table1` FOREIGN KEY     (`underlying_id`) REFERENCES `underlying_list_table` (`underlying_id`) ON DELETE CASCADE ON     UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

我创建了以下实体来表示该表:

@Entity
@Table(name="underlying_settle_value_table")
@IdClass(UnderlyingSettleValueTablePK.class)
public class UnderlyingSettleValueTableEntity implements Serializable {
    @Id
    @ManyToOne(targetEntity=UnderlyingListTableEntity.class)
    @JoinColumn(name="underlying_id",referencedColumnName="underlying_id")
    private UnderlyingListTableEntity underlyingId;

    @Id
    @Temporal(TemporalType.DATE)
    private Date valueDate;

    private Double settleValue;
    private Double riskFreeRate;
    @Column(name="div_yield")
    private Double divYield;

       .. setters and getters
 }

和idclass:

public class UnderlyingSettleValueTablePK implements Serializable {
    private UnderlyingListTableEntity underlyingId;
    @Temporal(TemporalType.DATE)    
    private Date valueDate;
..setters and getters
}

当我使用JPA或JQL提供的findAll方法搜索结果时,即使我已经将mappedid映射为多个,也会引发错误:

信息:HHH000327:执行加载命令时出错:org.hibernate.HibernateException:找到了多个具有给定标识符的行:OR N3,用于类com.invenio.dao.entity.admin.UnderlyingListTableEntity

任何帮助将不胜感激...提前致谢

从show_sql获取的sql查询如下:

Hibernate:
   select
        underlying0_.underlying_id as underlyi5_36_,
        underlying0_.value_date as value1_36_,
        underlying0_.div_yield as div2_36_,
        underlying0_.risk_free_rate as risk3_36_,
        underlying0_.settle_value as settle4_36_
    from
        underlying_settle_value_table underlying0_
    where
        underlying0_.underlying_id in (
            'OR N3'
        )
Hibernate:
    select
        underlying0_.underlying_id as underlyi1_35_0_,
        underlying0_.bbg_underlying_id as bbg2_35_0_,
        underlying0_.currency as currency3_35_0_,
        underlying0_.invenio_product_code as invenio4_35_0_
    from
        underlying_list_table underlying0_
    where
        underlying0_.underlying_id=?

2 个答案:

答案 0 :(得分:2)

好像你从搜索中获得了多个值。如果您可以清理数据库,请再次尝试搜索。我相信它会起作用..

你能否更清楚地提供unders_settle_value_table的表结构..你可以使用@Embeddable和@EmbeddedId来映射复合键。不要在同一个类中使用@Id两次

答案 1 :(得分:1)

试试这个。

@Entity
@Table(name="underlying_settle_value_table")
public class UnderlyingSettleValueTableEntity implements Serializable {

    @EmbeededId
    private UnderLiyingKey underKey;

    @MapsId("underID")
    @ManyToOne(targetEntity=UnderlyingListTableEntity.class)
    @JoinColumn(name="underlying_id",referencedColumnName="underlying_id")
    private UnderlyingListTableEntity underlyingId;

和embeddedKey

@Embeddable
public class UnderLying implements Serializable

private int underId;
private Date value_date;

但这里最大的担忧是:

表的PK由两个元素和Id和一个Date合成,但是同一个表的外键只使用ID,问题是如何引用一个使用复合键的实体一个值,不确定,但听起来不错。