[Biojava-l] Exception org.hibernate.NonUniqueObjectException
Augusto Fernandes Vellozo
augustovmail-java at yahoo.com.br
Mon Sep 1 14:21:25 UTC 2008
Hi Richard,
Thank you by the suggestion, but it didn't work also.
After a lot of tests, I discovered the error and I implemented one solution.
There is one error in the method RichObjectFactory.clearLRUCache(). This
method doesn't clear the static field CONTAINS_TERM in the class
SimpleRichFeatureRelationship. I created one static method in this class to
clear the field CONTAINS_TERM.
Now, finally, the program is working...
Cheers,
Augusto
2008/8/26 Richard Holland <dicknetherlands at gmail.com>
> Hello.
>
> In this function:
>
>
> if (countOrfs % stepORF == 0) {
> System.out.println(countOrfs);
> session.flush();
> tx.commit();
> session.clear();
> session.close();
> RichObjectFactory.clearLRUCache();
> session = sessionFactory.openSession();
> RichObjectFactory.connectToBioSQL(session);
>
>
> RichObjectFactory.setDefaultNamespaceName(Messages.getString("nameSpaceDefault"));
> tx = session.beginTransaction();
> }
>
> I don't think it's necessary to close and reopen the session. I think
> the following should work fine:
>
>
> if (countOrfs % stepORF == 0) {
> System.out.println(countOrfs);
> session.flush();
> tx.commit();
> session.clear();
> RichObjectFactory.clearLRUCache();
> tx = session.beginTransaction();
> }
>
> cheers,
> Richard
>
>
> 2008/8/20 Augusto Fernandes Vellozo <augustovmail-java at yahoo.com.br>:
> > Hi,
> > I am trying to load a lot of features from one file to MYSQL and i am
> having
> > problems to do this with BIOJAVA/hibernate.
> > If I don't do the flush/clear in the session, i have one exception like
> > OutOfMemory.
> >
> > But, after I do the flush/clear, the second query throws the exception:
> > org.hibernate.NonUniqueObjectException: a different object with the same
> > identifier value was already associated with the session: [Term#23755]
> >
> > I've already tried to clean the RichObjectFactory, but it doesn't work.
> >
> > Please, some one knows what could be happening? Some suggestion?
> > The code is below.
> >
> > Thanks,
> > --
> > Augusto F. Vellozo
> >
> > import java.io.BufferedReader;
> > import java.io.File;
> > import java.io.FileReader;
> > import java.util.TreeSet;
> >
> > import org.biojava.bio.BioException;
> > import org.biojavax.RichObjectFactory;
> > import org.biojavax.SimpleRichAnnotation;
> > import org.biojavax.bio.seq.RichFeature;
> > import org.biojavax.bio.seq.SimplePosition;
> > import org.biojavax.bio.seq.SimpleRichFeature;
> > import org.biojavax.bio.seq.SimpleRichLocation;
> > import org.biojavax.bio.seq.RichLocation.Strand;
> > import org.biojavax.bio.taxa.NCBITaxon;
> > import org.biojavax.ontology.SimpleComparableOntology;
> > import org.hibernate.Session;
> > import org.hibernate.SessionFactory;
> > import org.hibernate.Transaction;
> > import org.hibernate.cfg.Configuration;
> >
> > public class LoadORFVRTest
> > {
> > public static void main(String[] args) {
> > SessionFactory sessionFactory = new
> > Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
> > Session session = sessionFactory.openSession();
> > RichObjectFactory.connectToBioSQL(session);
> >
> >
> RichObjectFactory.setDefaultNamespaceName(Messages.getString("nameSpaceDefault"));
> > Transaction tx = session.beginTransaction();
> > try {
> > //file orfs
> > File fileOrfs;
> > fileOrfs = new File(args[0]);
> >
> > String orfName, geneName = "";
> > BufferedReader br = new BufferedReader(new
> > FileReader(fileOrfs));
> > String line, line2, line3, lineAmino;
> > int countOrfs = 0;
> > int beginPos = -1, endPos = -1, nextPos = -1;
> > int strand = 0;
> > int stepORF =
> > Integer.parseInt(Messages.getString("LoadORFVR.printORF"));
> > while ((line = br.readLine()) != null) {
> > if (line.length() > 0) {
> > if (line.startsWith(">")) { //ORF heading
> > //new ORF
> > //save last ORF
> > if (strand != 0) {
> > saveORF(session, strand, beginPos, endPos,
> > nextPos - 1, geneName, Integer.parseInt(args[1]));
> > countOrfs++;
> > }
> > if (countOrfs % stepORF == 0) {
> > System.out.println(countOrfs);
> > session.flush();
> > tx.commit();
> > session.clear();
> > session.close();
> > RichObjectFactory.clearLRUCache();
> > session = sessionFactory.openSession();
> > RichObjectFactory.connectToBioSQL(session);
> >
> >
> RichObjectFactory.setDefaultNamespaceName(Messages.getString("nameSpaceDefault"));
> > tx = session.beginTransaction();
> > }
> > orfName = line.substring(1);
> > geneName = orfName.substring(0,
> > orfName.indexOf("_"));
> > line = br.readLine();
> >
> > if (line.startsWith("Reading frame: ")) {
> > strand = Integer.parseInt(line.substring(15));
> > if (strand == 0) {
> > System.out.println("Format error, strand =
> > 0");
> > }
> > else {
> > nextPos = 1;
> > beginPos = -1;
> > endPos = -1;
> > }
> > }
> > else {
> > System.out.println("Format error in line
> > 'Reading frame':" + line);
> > strand = 0;
> > }
> > br.readLine(); // empty line
> > }
> > else if (strand != 0) { //ORF sequence
> > line2 = br.readLine();
> > line3 = br.readLine();
> > br.readLine(); // empty line
> > if (strand < 0) {
> > lineAmino = line3;
> > }
> > else {
> > lineAmino = line;
> > }
> > lineAmino = lineAmino.substring(3,
> > lineAmino.length() - 1);
> > if (lineAmino.trim().length() != 0) {
> > if (beginPos < 0) {
> > beginPos = nextPos +
> > firstPosNotSpace(lineAmino) - 1;
> > }
> > endPos = nextPos + lastPosNotSpace(lineAmino)
> +
> > 1;
> > }
> > nextPos += lineAmino.length();
> > }
> > }
> > }
> > if (strand != 0) {
> > saveORF(session, strand, beginPos, endPos, nextPos - 1,
> > geneName, Integer.parseInt(args[1]));
> > }
> > session.flush();
> > tx.commit();
> > session.clear();
> > }
> > catch (Exception e) {
> > e.printStackTrace();
> > }
> > finally {
> > if (tx.isActive()) {
> > tx.rollback();
> > }
> > session.close();
> > }
> >
> > }
> >
> > public static void saveORF(Session session, int strand, int beginPos,
> > int endPos, int lastPos, String geneName,
> > int ncbiTaxonId) throws BioException {
> > SimplePosition beginPosition, endPosition;
> > if (strand < 0 && beginPos < 4) {
> > beginPosition = new SimplePosition(true, false, beginPos);
> > }
> > else {
> > beginPosition = new SimplePosition(beginPos);
> > }
> > if (strand > 0 && (endPos == lastPos)) {
> > endPosition = new SimplePosition(false, true, endPos);
> > }
> > else {
> > endPosition = new SimplePosition(endPos);
> > }
> > // save;
> > NCBITaxon taxon = (NCBITaxon) session.createQuery("from Taxon
> where
> > ncbi_taxon_id=:ncbiTaxonNumber").setInteger(
> > "ncbiTaxonNumber", ncbiTaxonId).uniqueResult();
> >
> > SimpleComparableOntology ontFeatures = (SimpleComparableOntology)
> > RichObjectFactory.getObject(
> > SimpleComparableOntology.class, new Object[]
> > {Messages.getString("ontologyFeatures")});
> > SimpleComparableOntology ontGeneral = ((SimpleComparableOntology)
> > RichObjectFactory.getObject(
> > SimpleComparableOntology.class, new Object[]
> > {Messages.getString("ontologyGeneral")}));
> > SimpleRichFeature featureGene = (SimpleRichFeature)
> > session.createQuery(
> > "select f from Feature as f join f.parent as b where "
> > + "f.name=:geneName and f.typeTerm=:geneTerm and
> > b.taxon=:taxonId ").setString("geneName", geneName).setParameter(
> > "taxonId", taxon).setParameter("geneTerm",
> >
> ontFeatures.getOrCreateTerm(Messages.getString("termGene"))).uniqueResult();
> > RichFeature.Template ft = new RichFeature.Template();
> > ft.location = featureGene.getLocation().translate(0);
> > ft.sourceTerm =
> > ontGeneral.getOrCreateTerm(Messages.getString("termVR"));
> > ft.typeTerm =
> > ontFeatures.getOrCreateTerm(Messages.getString("termMRNA"));
> > ft.annotation = new SimpleRichAnnotation();
> > ft.featureRelationshipSet = new TreeSet();
> > ft.rankedCrossRefs = new TreeSet();
> > SimpleRichFeature featureMRNA = (SimpleRichFeature)
> > featureGene.createFeature(ft);
> > featureMRNA.setName(geneName);
> >
> > ft = new RichFeature.Template();
> > if (strand < 0) {
> > ft.location = new SimpleRichLocation(beginPosition,
> endPosition,
> > 0, Strand.NEGATIVE_STRAND);
> > }
> > else {
> > ft.location = new SimpleRichLocation(beginPosition,
> endPosition,
> > 0, Strand.POSITIVE_STRAND);
> > }
> > ft.sourceTerm =
> > ontGeneral.getOrCreateTerm(Messages.getString("termVR"));
> > ft.typeTerm =
> > ontFeatures.getOrCreateTerm(Messages.getString("termORF"));
> > ft.annotation = new SimpleRichAnnotation();
> > ft.featureRelationshipSet = new TreeSet();
> > ft.rankedCrossRefs = new TreeSet();
> > SimpleRichFeature featureORF = (SimpleRichFeature)
> > featureMRNA.createFeature(ft);
> > featureORF.setName(geneName);
> > }
> >
> > public static int firstPosNotSpace(String str) {
> > int i = 0;
> > while (i < str.length() && str.charAt(i) == ' ') {
> > i++;
> > }
> > return i;
> > }
> >
> > public static int lastPosNotSpace(String str) {
> > int i = str.length() - 1;
> > while (i >= 0 && str.charAt(i) == ' ') {
> > i--;
> > }
> > return i;
> > }
> > }
> > _______________________________________________
> > Biojava-l mailing list - Biojava-l at lists.open-bio.org
> > http://lists.open-bio.org/mailman/listinfo/biojava-l
> >
>
>
>
> --
> Richard Holland
> Finance Director
> Eagle Genomics
> http://www.eaglegenomics.com/
>
--
Augusto F. Vellozo
More information about the Biojava-l
mailing list