Ein Objekt mit "auto_increment key " in der Schleife speichern

Dimax

Top Contributor
Hallo,
ich versuche gerade alle Texte aus einem Programmcode durch Unterstriche zu ersetzen und gleichzeitig in DB zu speichern:

die Methode
Java:
public static String replaceTexte(int projekt_id,int programm_id,String text,LiteralRepository litRepo) {
      
        String textRegex="([\']([^\\\\\']*([\\\\].)*)*[\'])";
        Pattern paternText=Pattern.compile(textRegex);
        Matcher matchText=paternText.matcher(text);
        String textRegex1="([\"]([^\\\\\"]*([\\\\].)*)*[\"])";
        Pattern paternText1=Pattern.compile(textRegex1);
        Matcher matchText1=paternText1.matcher(text);
        StringBuffer zwischenSaveZumErsetzen=new StringBuffer("");
        StringBuffer zwischenSave=new StringBuffer(text);
        StringBuffer literal=new StringBuffer("");
        int index1=0;
        int index2=0;
       
        while(matchText.find()) {
            System.out.println("das ist Treffer1"+(++count)+" vom Type->singleQuote");
            index1=matchText.start()+1;
            index2= matchText.end()-1;
            literal.append(text.substring(index1,index2));
            LiteralPK litPK=new LiteralPK(projekt_id,programm_id);
            Literal lit=new Literal(litPK,literal.toString(),"singleQuote",index1, index2);
            litRepo.save(lit);
            literal.setLength(0);
            zwischenSaveZumErsetzen.append(ersetzenDurchUnterschtrich(text.substring(index1,index2)));
            zwischenSave.replace(index1, index2,zwischenSaveZumErsetzen.toString());
            zwischenSaveZumErsetzen.setLength(0);
           
        }
        while(matchText1.find()) {
            
            index1=matchText1.start()+1;
            index2= matchText1.end()-1;
            literal.append(text.substring(index1, index2));
            LiteralPK litPK=new LiteralPK(projekt_id,programm_id);
            Literal lit=new Literal(litPK,literal.toString(),"doubleleQuote",index1,index2);
            System.out.println("das ist Treffer->"+lit.getLiteral());
            litRepo.save(lit);
            literal.setLength(0);
            zwischenSaveZumErsetzen.append(ersetzenDurchUnterschtrich(text.substring(index1, index2)));
            zwischenSave.replace(index1,index2,zwischenSaveZumErsetzen.toString());
            zwischenSaveZumErsetzen.setLength(0);
           
        }

        return zwischenSave.toString();
    }
Das ist das Literal Primary Key Model:
Java:
@Embeddable
public class LiteralPK implements Serializable{
    
        //default serial version id, required for serializable classes.
        private static final long serialVersionUID = 1L;
        
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="literal_id")
        private int literalId;
        
        @Column(name="projekt_id", insertable=false, updatable=false)
        private int projektId;

        @Column(name="programm_id", insertable=false, updatable=false)
        private int programmId;

        public LiteralPK() {
            
        }
        public LiteralPK(int projektId, int programmId) {
            super();
            this.projektId = projektId;
            this.programmId = programmId;
        }
}
Das Programm ersetzt richtig alle Texte, aber es kommt zu einem Fehler wenn's im Code zweites Text gefunden wird->

Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;
statement executed: update literal set literal=?, type=?, zeile_beginn=?, zeilen_ende=? where literal_id=? and programm_id=? and projekt_id=?; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: update literal set literal=?, type=?, zeile_beginn=?, zeilen_ende=? where literal_id=? and programm_id=? and projekt_id=?
org.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: update literal set literal=?, type=?, zeile_beginn=?, zeilen_ende=? where literal_id=? and programm_id=? and projekt_id=?; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: update literal set literal=?, type=?, zeile_beginn=?, zeilen_ende=? where literal_id=? and programm_id=? and projekt_id=?
Ich vermute dass hängt mit dem auto_icrement zusammen.
 

LimDul

Top Contributor
Täusch ich mich, oder fehlt da die @Id Annotation an der Variablen literalId?

Edit:
Aus der Doku:
The GeneratedValue annotation may be applied to a primary key property or field of an entity or mapped superclass in conjunction with the Id annotation. The use of the GeneratedValue annotation is only required to be supported for simple primary keys. Use of the GeneratedValue annotation is not supported for derived primary keys.
 

Dimax

Top Contributor
Täusch ich mich, oder fehlt da die @Id Annotation an der Variablen literalId?
Ja die @Id fehlt. Also das scheint wie ein komplexes Problem .
In der DB habe ich den primary key von Literal als literal_id (auto_increment), projekt_id ,programm_id.
Wenn ich das Model von der Tabelle erstelle , dann brauche ich separate primary key Klasse.
Und wenn ich die separate Klasse erstelle, darf ich keine GeneratedValue benutzen. Und wenn ich keine GeneratedValue benutze , muss ich die letzte gespeicherte literal_id von der DB holen .Aber wenn die Mysql DB es zulässt ,dass das primary key so gebaut wird ,dann soll es auch ein Weg in Spring dafür geben, oder?
 

LimDul

Top Contributor
Warum ist projekt_id und programm_id im PK drin? Wenn du eine autoincrement spalte hast, ist die bereits eindeutig.
Gefühlt ist die Tabelle damit auch nicht in Normalform
 

Dimax

Top Contributor
Ich habe im primary key nur die literal_id gelassen. In der DB die beiden anderen keys von dem PK rausgenommen ,die leuchten zwar rot , aber das Programm läuft. Danke Jungs für die Hilfe.
 

Neue Themen


Oben