所以我对数据库中的某些表进行了反向工程,当我尝试将对象保存到数据库中时,出现以下错误:
初始SessionFactory创建失败。org.hibernate.AnnotationException:从com.mycode.Account引用com.mycode.Block的外键具有错误的列数。在线程“ main”中应为2异常java.lang.ExceptionInInitializerError
域对象是阻止,其中包含许多帐户对象:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "Block") public Set<EAccount> getAccounts() { return this.Accounts; }
帐户具有ID和角色的组合键。这是在单独的类中设置的:
@Embeddable public class BlockAccountId implements java.io.Serializable { private long blockOid; private String accountRole; public BlockAccountId() { } public BlockAccountId(long blockOid, String accountRole) { this.blockOid = blockOid; this.accountRole = accountRole; } @Column(name = "BLOCK_OID", nullable = false) public long getBlockOid() { return this.blockOid; } public void setBlockOid(long blockOid) { this.blockOid = blockOid; } @Column(name = "ACCOUNT_ROLE", nullable = false, length = 10) public String getAccountRole() { return this.accountRole; } public void setAccountRole(String accountRole) { this.accountRole = accountRole; }
所以我想知道。如何链接表block和accountOid上的blockO,但仍要确保account表同时具有blockOid和accountRole作为组合键。
任何例子将不胜感激!
注意,这是一个冻结(一个)到帐户(许多)的关系。
谢谢
最简单的方法是将您的关联直接放在嵌入式id组件中。
Hibernate参考文档 5.1.2.1.1节。id作为使用组件类型的属性()
Hibernate参考文档
示例(仅编写重要的getter()和setter())
@Entity public class Block { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="BLOCK_OID") long blockOid; @OneToMany(fetch = FetchType.LAZY, mappedBy = "id.block", cascade=CascadeType.ALL) Set<Account> accounts = new HashSet<Account>(); } @Entity public class Account { @EmbeddedId BlockAccountId id; public Account() { this.id = new BlockAccountId(); } public void setBlock(Block pBlock) { this.id.setBlock(pBlock); } public Block getBlock() { return this.id.getBlock(); } public String getAccountRole() { return this.id.getAccountRole(); } public void setAccountRole(String accountRole) { this.id.setAccountRole(accountRole); } } @Embeddable public class BlockAccountId implements java.io.Serializable { @ManyToOne(optional = false) private Block block; @Column(name = "ACCOUNT_ROLE", nullable = false, length = 10) private String accountRole; public BlockAccountId() { } //Implement equals and hashcode }
对应的数据库表是:
CREATE TABLE block ( BLOCK_OID bigint(20) NOT NULL auto_increment, PRIMARY KEY (`BLOCK_OID`) ) CREATE TABLE account ( ACCOUNT_ROLE varchar(10) NOT NULL, block_BLOCK_OID bigint(20) NOT NULL, PRIMARY KEY (`ACCOUNT_ROLE`,`block_BLOCK_OID`), KEY `FK_block_OID` (`block_BLOCK_OID`), CONSTRAINT `FK_block_OID` FOREIGN KEY (`block_BLOCK_OID`) REFERENCES `block` (`BLOCK_OID`) )