Announcement

Collapse
No announcement yet.

JPA - Persistierung einer Map

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JPA - Persistierung einer Map

    Hallo zusammen,

    ich habe ein Problem bei der Persistierung einer MAP.

    So bald ich ein neues Run-Objekt erstelle deren HashMap (config) gefüllt (mehrere Einträge) ist und das persistiere erhalte ich die unten stehende Fehlermeldung. Wen ich ein neues Run-Objekt persistiere deren HashMap keine Einträge hat erhalte ich keine Fehlermeldung.

    Seltsamerweise funktioniert aber das Auslesen aus der DB. Ich habe in die config Tabelle manuell Einträge eingefügt. Ich erhalte dann beim Auslesen eines Run-Objektes aus der DB auch die Werte aus der config-Tabelle in meiner HashMap.

    Beim Einlesen aus der DB funktioniert es also. Beim Persistieren neuer Objekte aber nicht. Warum?




    Code:
    @Entity
    public class Run {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        
        private String name;
            
        @ElementCollection 
        @MapKeyColumn(name="key") 
        @Column(name="value")
        @CollectionTable(name="Config", joinColumns=@JoinColumn(name="run"))
        private Map<String, String> config; 
    
        public Run() 
        {
           taskConfig = new HashMap<String, String>(); 
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Map<String, String> getConfig() {
            return config;
        }
    
        public void setConfig(Map<String, String> config) {
            this.config = config;
        }
    }

    Code:
                Run run = em.find(Run.class, 3);
    
                System.out.println(run.getName());
                System.out.println(run.getConfig().size());
                
    // bis zu diesem Zeitpunkt funktoniert es
                
                Map<String, String> config = new HashMap<String, String>();
                config.put("dbname", "codie");
                run.setConfig(config);
    
                em.getTransaction().begin();
                em.persist(run);
                em.getTransaction().commit();

    Code:
    Table RUN:
    id int PK
    name varchar(255)
    
    
    Table Config:
    id int PK
    run int FK (Null) // Null-Werte möglich
    key varchar(255)
    value varchar(255)

    Error Code: 1064
    Call: INSERT INTO config (run, value, key) VALUES (?, ?, ?)
    bind => [3 parameters bound]
    Query: DataModifyQuery(sql="INSERT INTO config (run, value, key) VALUES (?, ?, ?)")

  • #2
    versuch zuerst die config zu persitieren
    Christian

    Comment


    • #3
      geht leider nicht

      Run run = em.find(Run.class, 3);

      System.out.println(run.getName());
      System.out.println(run.getConfig().size());


      Map<String, String> config = run.getConfig();
      config.put("fussball", "test");

      em.getTransaction().begin();
      em.persist(config);
      em.getTransaction().commit();

      Exception in thread "main" java.lang.IllegalArgumentException: Object: {{{fussball=test, dbname=testdb, dbIpAddress=localhost}}} is not a known entity type.
      at org.eclipse.persistence.internal.sessions.UnitOfWo rkImpl.registerNewObjectForPersist(UnitOfWorkImpl. java:4169)
      at org.eclipse.persistence.internal.jpa.EntityManager Impl.persist(EntityManagerImpl.java:440)

      Comment


      • #4
        Eigentlich sollte das gehen:


        @Entity
        public class Example {
        @Id long id;
        // ....
        @ElementCollection
        @MapKeyColumn(name="name")
        @Column(name="value")
        @CollectionTable(name="example_attributes", joinColumns=@JoinColumn(name="example_id"))
        Map<String, String> attributes = new HashMap<String, String>();


        Du bist sicher, dass der o.a. Code der Code ist, der läuft? Wer ist taskconfig in der Klasse run? Ist nicht deklariert
        Christian

        Comment


        • #5
          so Fehler ist gefunden. nach einer hablen ewigkeit habe ich diesen verdammten fehler endlich gefunden.

          die beiden namen der spalten in der datenbank "key" und "value" sind vorbelegte Identifier der Persistence Api oder von einem anderen Quatsch.
          muss dass dann entsprechend berücksichtigen, siehe unten.

          Super Sache ...


          @ElementCollection
          @MapKeyColumn(name="\"key\"")
          @Column(name="\"value\"")
          @CollectionTable(name="config", joinColumns=@JoinColumn(name="run"))
          private Map<String, String> config;

          Comment

          Working...
          X