0

私は2つのテーブルを持っています.1つはTRANSACTIONと呼ばれるMasterテーブルで、2つ目はこのテーブルが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`)
);

トランザクションとトランザクション レコードの間に 1 対 1 のマッピングがあります。これは、1 つのトランザクションが 1 つのレコードしか持てないことを意味します。いくつかの理由で、このテーブルを個別に保持しています。したがって、私のクラスは次のようになります。

@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 はそのテーブルに永続化する必要があります。これを行う方法はありますか?必要に応じて、テーブル構造を変更できます。必要なのは2つのテーブルだけです。

4

2 に答える 2

0

これをマップするにはいくつかのオプションがありますが、2 つの別個のエンティティで処理しているようです。両方のエンティティが同じ主キー値を共有しているため、pk 値の生成を制御したいエンティティに基づいて参照マッピングを変更する必要があります。現状では、e3_transaction.transactionid フィールドは 2 つの別々のマッピングによって設定されています。transactionid long および TransactionRecord レコード参照。

他の回答で提案されているように @MapsId を使用する場合は、 @GeneratedValue コードを TransactionRecord エンティティに移動する必要があります。これは、JPA プロバイダーが参照された TransactionRecord の値を使用して transactionid 属性とデータベースを設定するためです。分野。これは単純で洗練された解決策ですが、トランザクションから Long transactionid 属性を削除し、レコード参照を (@MapsId の代わりに) @Id でマークすることもできます。TransactionRecord 内の長い transactionId 値は、EntityManager getReference および find 呼び出しのトランザクションの ID として引き続き使用されます。

Transaction 内の transactionid に @GeneratedValue を保持できるようにする別のオプションは、レコード参照に @JoinColumn アノテーションを定義し、フィールドが挿入可能 = false、更新可能 = false であることを指定することです。次に、TransactionRecord を変更して、Transaction インスタンスから transectionid 値をプルしてその ID として使用できるように、Transaction との後方関係を持つようにする必要があります。これは、@ID との関係をマークするだけで実現できます。

于 2013-09-06T17:42:12.293 に答える