我有一个有很多关系的应用程序。完成行创建的部分工作正常。现在我还需要在维护父母的同时检索记录并仅删除链接。
为此我添加了另一个代表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
答案 0 :(得分:1)
您的问题非常详细,请仔细阅读。所以M2M这个例子可能有所帮助。
现在用一个关联表“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。
我只想避免多次数据库访问。
希望这可以帮助有类似问题的人