JPA-如何将记录添加到主表和子表?

时间:2013-09-04 12:54:15

标签: sql hibernate jpa

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

TRANSACTION

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`)
);

它将在Transaction和事务记录之间进行一对一的映射。这意味着一个事务只能有一个记录。出于某些原因,我已将此表分开保存。所以我的班级将如下所示:

@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 个答案:

答案 0 :(得分:0)

使用

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

TransactionRecord必须具有与没有值生成的事务相同类型的@Id。

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

答案 1 :(得分:0)

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

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

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