我有两个表一个是一个名为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应该保留在它的表中。有没有办法做到这一点? 如果需要,可以更改表结构。我只需要两张桌子。
答案 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标记关系来实现。