0

我有两个表,一个是名为 TRANSACTION 的主表,第二个是该表称为 TRANSACTION_RECORD 的事务记录。

交易

CREATE TABLE `e3_transaction` (
  `transactionid` bigint(20),
  `transactiontype` varchar(10),
  `transactionstatus` varchar(10),
  PRIMARY KEY  (`transactionid`)
);

TRANSACTION_RECORD

CREATE TABLE `e3_as2805msg4` (
  `transectionid` bigint(20),
  `messageType` int(4),
  `cardAcceptorName` varchar(40),
  `adNational` varchar(1000),
  `adPrivate` varchar(1000),
  KEY `transectionidFK` (`transectionid`),
  CONSTRAINT `transectionidFK` FOREIGN KEY (`transectionid`) REFERENCES `e3_transaction` (`transactionid`)
);

它将在交易和交易记录之间进行一对一的映射。这意味着一笔交易只能有一条记录。由于某些原因,我将这张表分开保存。所以我的课看起来像这样:

@Entity
@Table(name = "e3_transaction")
public class Transaction {

    @Id
    @GeneratedValue(generator = "assigned-by-code")
    @GenericGenerator(name = "assigned-by-code", strategy = "assigned")
    @Column(name = "transactionid", unique = true, nullable = false)
    private Long transactionid;

    @Column(name = "transactiontype", nullable = false, length = 10)
    private String transactiontype;

    @Column(name = "transactionstatus", nullable = false, length = 10)
    private String transactionstatus;

    @oneToOne
    private TransactionRecord record;
}

我想同时保留两个对象。当我坚持一个 TRANSACTION 时,TRANSACTION_RECORD 应该坚持在它的表中。有没有办法做到这一点?如果需要,您可以更改表结构。我唯一需要的是两张桌子。

4

2 回答 2

0

有几个选项可以映射它,但看起来您正在使用两个单独的实体处理它。由于两个实体共享相同的主键值,因此您的参考映射将需要根据您希望控制 pk 值生成的实体进行更改 - 就目前而言, e3_transaction.transactionid 字段由两个单独的映射设置;transactionid long 和 TransactionRecord 记录引用。

如果您希望按照其他答案中的建议使用 @MapsId,则需要将 @GeneratedValue 代码移动到 TransactionRecord 实体,因为 JPA 提供程序将使用引用的 TransactionRecord 中的值来设置 transactionid 属性和数据库场地。这是一个简单优雅的解决方案,但您也可以从 Transaction 中删除 Long transactionid 属性,只需使用 @Id(而不是 @MapsId)标记记录引用。TransactionRecord 中的 long transactionId 值仍将用作 EntityManager getReference 和 find 调用的 Transaction id。

另一个允许在 Transaction 中的 transactionid 上保留 @GeneratedValue 的选项是在记录引用上定义 @JoinColumn 注释并指定该字段是可插入的=false,可更新的=false。然后,您需要修改 TransactionRecord,使其与 Transaction 具有反向关系,以便它可以从 Transaction 实例中提取 transectionid 值以用作其 id。这可以通过简单地用@ID 标记关系来完成。

于 2013-09-06T17:42:12.293 回答
0

适用于

    @OneToOne(cascade=CascadeType.ALL)
    @MapsId
    private TransactionRecord record;

TransactionRecord 必须具有与 Transaction 相同类型的 @Id,并且不生成值。

尝试使用 Hibernate 作为 JPA 2.0 提供程序。

于 2013-09-04T15:11:46.950 回答