当前位置: 首页 > 面试题库 >

如何使用注释在Hibernate中表示复合键?

司空鸣
2023-03-14
问题内容

所以我对数据库中的某些表进行了反向工程,当我尝试将对象保存到数据库中时,出现以下错误:

初始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作为使用组件类型的属性()

示例(仅编写重要的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`)
)


 类似资料:
  • 问题内容: 我试图用来向没有定义主键的表中插入数据。 但是事实是该表的两个字段一起在表中是唯一的。我如何使用hibernate注释实现相同的目的? 这是我的代码。 问题答案: 您可以使用和创建复合键,并将其与您的实体进行映射。例如: 然后在Java代码中使用常规方式来持久化实体。 参考:http : //docs.jboss.org/hibernate/annotations/3.5/refere

  • 问题内容: 在Hibernate中如何注释Blob列?到目前为止,我有一堂课,有: 问题答案: @Lob应该可以解决blob和clob(使用String作为类型)

  • 在Hibernate中使用判别值注释的最佳场景是什么以及何时?

  • 我有一个数据库,它的一些表之间有关系,例如,我必须表Person和Company,它们的Id之间有一个一对多的关系,这是在Hibernate生成的表名Person_Company中构建的。当我在java中使用@onetomany和@manytoone注释时,它在它们之间建立了关系,但不是根据Person_Company表,我只使用表的Id什么是正确的注释?

  • 如果我没有指定JoinColumn,hibernate将尝试使用字段child_username和child_parentid进行映射。如果我只指定一个Joincolumn,我会得到一个断开的映射。如果指定了两个JoinColumns,则parent上没有列可指定。 我如何映射这个类并将用户名作为标准传入?(它来自身份验证数据)或者如果我偏离了轨道,我如何以不同的方式这样做。

  • 问题内容: 标题不言自明。 我很高兴听到解决方案,谢谢。 问题答案: 到目前为止,有一种比列出的方法更短的方法: