Hibernate复合键只有外键

时间:2014-12-04 06:06:16

标签: hibernate

我有一个有很多关系的应用程序。完成行创建的部分工作正常。现在我还需要在维护父母的同时检索记录并仅删除链接。

为此我添加了另一个代表Link的类。此类不包含其他列,但包含使用其他类表示的id。 id类包含外键。

我的问题是@many到很多注释也需要在id类中吗?

我已经尝试过,在列出它时,它给了我一个'而不是一个关联'异常异常

这是我的相关代码:

    @Entity
@Table(name="trans.documentlink")
public class DocumentObjectLink
{

     @Id
      private LinkId id;

    /**
     * @return the id
     */
    public LinkId getId()
    {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(LinkId id)
    {
        this.id = id;
    }


}

    @Embeddable
public class LinkId implements Serializable
{
    //private String comment;
    private DocumentGroup document;
    private DocumentFile docFile;

public LinkId(DocumentFile fileId, DocumentGroup docId)
{
    super();
    this.docFile = fileId;
    this.document = docId;
}

@Override
public boolean equals(Object obj) {
    LinkId cp =(LinkId)obj;
    if(this.docFile.equals(cp.getDocFile()) && this.document.equals(cp.getDocument())){
        return true;
    }else{
        return false;
    }
}

@Override
public int hashCode() {
    return this.docFile.hashCode()+this.document.hashCode();
}

/**
 * @return the documentFile
 */
@ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name = "fileid" , nullable = false)
public DocumentFile getDocFile()
{
    return docFile;
}
/**
 * @param documentFile the documentFile to set
 */
public void setDocFile(DocumentFile documentFile)
{
    this.docFile = documentFile;
}


/**
 * @return the document
 */
@ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name = "documentid", nullable = false)
public DocumentGroup getDocument()
{
    return document;
}
/**
 * @param document the document to set
 */
public void setDocument(DocumentGroup document)
{
    this.document = document;
}

}

我得到异常的代码是:

@Override
public boolean deleteOnlyLinks(long documentId, String nodeId)
{
    Criteria docFile = null;
    try
    {
        docFile = getCriteria(DocumentObjectLink.class);
    docFile.createAlias("id.docFile", "file");
    docFile.createAlias("id.document", "doc");
    docFile.add(Restrictions.eq("file.id", documentId));
    docFile.add(Restrictions.eq("doc.nodeId", nodeId));
    List<DocumentObjectLink> lst =  docFile.list();
        if(lst.size() > 0)
        {
            getCrntSession().delete(lst.get(0));
        }
    } catch (Exception e)
    {

        logger.debug("Error while deleting" + documentId);
        throw new DMSException("Error while deleting" + documentId,ErrorCode.DELETE,e);
    }
    return true;

}

例外是:

org.hibernate.QueryException: not an association: id.docFile

EDIT ::

我试图将一个名为id的int列添加到db中,该列不是主键但具有生成值。然后我将foriegn键移动到documentobjectlink类并尝试运行以下代码

@Override
public boolean deleteOnlyLinks(long documentId, String nodeId)
{
    Criteria docFile = null;
    try
    {
        docFile = getCriteria(DocumentObjectLink.class);
        docFile.createAlias("docFile", "file");
        docFile.createAlias("document", "doc");
        docFile.add(Restrictions.eq("file.id", documentId));
        docFile.add(Restrictions.eq("doc.nodeId", nodeId));
        List<DocumentObjectLink> lst =  docFile.list();
        if(lst.size() > 0)
        {
            getCrntSession().delete(lst.get(0));
        }
    } catch (Exception e)
    {

        logger.debug("Error while deleting" + documentId);
        throw new DMSException("Error while deleting" + documentId,ErrorCode.DELETE,e);
    }
    return true;

}

现在我得到了例外

not an association: docFile 

2 个答案:

答案 0 :(得分:1)

您的问题非常详细,请仔细阅读。所以M2M这个例子可能有所帮助。

  • 一名学生“可以”获取课程/课程列表[带#ID的学生表]
  • 一门课程/课程“有很多”学生参加。 [带#ID的课程表]

现在用一个关联表“StudentCourse”压扁这个M2M,这将产生两个One2One关联。

SudentCourse [复合主键(studentID,courseID)],在数据库级别,您还将创建指向Student.ID的studentID和指向Course.ID的courseID - fks。

Hibernate应该适当删除链接。

请参阅第7.5.3节:https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/associations.html

create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
create table Address ( addressId bigint not null primary key )

答案 1 :(得分:0)

从Prems回答我意识到很难理解我的要求。

我想用别名执行查询。我没有id值的其中一个部分的id值。如您所见,我的nodeId不是DocumentGroup表中的主键。因此我试图将对象放在ID类而不是id中。

我现在更改了我的代码,只将id作为复合键类。我不得不添加另一个查询来从DocumentGroup表中检索行,然后在下一个查询中使用该ID。

我只想避免多次数据库访问。

希望这可以帮助有类似问题的人