我正在使用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方法搜索结果时,它会给我一个错误,即使我已经将underlyingid映射为一个:
信息:HHH000327:执行加载命令时出错:org. hibernate.HibernateException:找到具有给定标识符的多行:OR N3,用于类com.invenio.da.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=?
似乎您从搜索中获得了多个值。如果您可以清理数据库n再次尝试搜索。我相信它会起作用的…
你能更清楚地提供underlying_settle_value_table的表结构吗…你可以使用@Embedable和@EmbeddedId来映射复合键。不要在同一个类中使用两次@Id
试试这个。
@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;
和嵌入的密钥
@Embeddable
public class UnderLying implements Serializable
private int underId;
private Date value_date;
但这里最大的担忧是:
表的PK由两个元素和Id和Date组成,但是同一个表的外键只使用ID,问题是你如何引用一个只使用一个值的复合键的实体,不确定,但这听起来是一个糟糕的设计。