2015-09-30 2 views
1

J'étudie actuellement l'exemple de code de l'application Boilerplates Java DB Web Starter sur bluemix et j'ai quelques problèmes pour changer la table. Mon DB est prêt et fonctionne là. J'ai essayé de changer le code au lieu d'obtenir de la table de todolist, pour obtenir de ma table de pays. Voici l'image de la façon dont je l'ai changé le code:Modifier les tables de Boilerplates Java Exemple de DB Web Starter sur bluemix

http://i.imgur.com/MglCM6T.png

package example.jpa; 

import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Country") 
public class TODO { 

    @Id //primary key 
    @Column(name = "country_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    int id; 

    @Basic 
    @Column(name = "country_name") 
    String name; 

    public String getName() { 
     System.out.println(name); 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getId() { 
     System.out.println(id); 
     return id; 
    } 

    public void setId(int pk) { 
     id = pk; 
    } 

    @Override 
    public String toString() { 
     return String.format("{\"id\": \"%d\", \"name\": \"%s\"}", id, name); 
    } 
} 

http://i.imgur.com/tirtUaY.

package example.jpa; 

import java.util.List; 

import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.persistence.EntityManager; 
import javax.transaction.UserTransaction; 
import javax.ws.rs.DELETE; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("/Country") 
public class TODOListResource { 

    private UserTransaction utx; 
    private EntityManager em; 

    public TODOListResource() { 
     utx = getUserTransaction(); 
     em = getEm(); 
    } 

    @POST 
    public Response create(@FormParam("name") String name) { 
     TODO todo = new TODO(); 
     todo.setName(name); 
     try { 
      utx.begin(); 
      em.persist(todo); 
      utx.commit(); 
      return Response.ok(todo.toString()).build(); 
     } catch (Exception e) { 
      e.printStackTrace();    
      return Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).build(); 
     } finally { 
      try { 
       if (utx.getStatus() == javax.transaction.Status.STATUS_ACTIVE) { 
        utx.rollback(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @DELETE 
    public Response delete(@QueryParam("country_id") int id) { 
     try { 
      utx.begin(); 
      TODO todo = em.find(TODO.class, id); 
      if (todo != null) { 
       em.remove(todo); 
       utx.commit(); 
       return Response.ok().build(); 
      } else { 
       return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND).build(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).build(); 
     } finally { 
      try { 
       if (utx.getStatus() == javax.transaction.Status.STATUS_ACTIVE) { 
        utx.rollback(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @PUT 
    public Response update(@FormParam("country_id") int id, 
      @FormParam("name") String name) { 
     try { 
      utx.begin(); 
      TODO todo = em.find(TODO.class, id); 
      if (todo != null) { 
       todo.setName(name);// TODO check if null 
       em.merge(todo); 
       utx.commit(); 
       return Response.ok().build(); 
      } else { 
       return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND).build(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).build(); 
     } finally { 
      try { 
       if (utx.getStatus() == javax.transaction.Status.STATUS_ACTIVE) { 
        utx.rollback(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response get(@QueryParam("country_id") int id) { 
     if (id == 0) { 
      List<TODO> list = em.createQuery("SELECT country_id, country_name FROM country", TODO.class).getResultList(); 
      if (list.size() == 0) { 
       list = em.createQuery("SELECT country_id, country_name FROM country", TODO.class).getResultList(); 
      } 
      //TODO use JSON util like Gson to render objects and use REST Response Writer 
      String json = "{\"id\":\"all\", \"body\":" + list.toString() + "}"; 
      return Response.ok(json).build(); 
     } 
     TODO todo = null; 
     try { 
      utx.begin(); 
      todo = em.find(TODO.class, id); 
      utx.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.status(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR).build(); 
     } finally { 
      try { 
       if (utx.getStatus() == javax.transaction.Status.STATUS_ACTIVE) { 
        utx.rollback(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     if (todo != null) 
      return Response.ok(todo.toString()).build(); 
     else 
      return Response.status(javax.ws.rs.core.Response.Status.NOT_FOUND).build(); 
    } 

    /*private void createSampleData() { 
     create("sample entry #1"); 
     create("sample entry #2"); 
     create("sample entry #3"); 
    }*/ 

    private UserTransaction getUserTransaction() { 
     InitialContext ic; 
     try { 
      ic = new InitialContext(); 
      return (UserTransaction) ic.lookup("java:comp/UserTransaction"); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 


    private EntityManager getEm() { 
     InitialContext ic; 
     try { 
      ic = new InitialContext(); 
      return (EntityManager) ic.lookup("java:comp/env/openjpa-todo/entitymanager"); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

Je ne pouvais pas trouver aussi là où elle est la création de la table TODO quand il n'existe pas dans ma db.

Merci

+0

Pouvez-vous expliquer les problèmes que vous rencontrez? Je ne vois rien de manifestement mauvais avec vos changements, donc un message d'erreur serait probablement utile. – opiethehokie

+0

C'est beaucoup mieux si vous ajoutez réellement le code lui-même plutôt que d'ajouter le code en tant qu'images. Personne ne va taper ce code. Vous devez le rendre facile pour les gens pour vous aider, d'où la recommandation de créer un [mcve] (http://stackoverflow.com/help/mcve) – kkuilla

+0

Donc, j'ai édité ma question ajouter les codes. J'ai une table sur le nom de pays bluemix avec deux colonnes: country_id (int) et country_name (varchar). J'ai téléchargé l'exemple de code de démarrage web JavaDB et quand j'ai couru, il a créé la table todolist sur mon db. Ce que j'essaie de faire avec le code est de comprendre comment il interagit avec ma base de données, donc je voulais changer la table todolist à ma table de pays. J'ai fait ces modifications que j'ai montrées dans les deux classes et maintenant ça me donne une erreur. Je suis un débutant sur bluemix et j'essaye de créer une application avec java et db. Appréciez l'aide. :) – Daiane

Répondre

3

Table création est configuré dans le fichier persistence.xml du passe-partout. JPA peut le créer pour vous, donc l'application ne le fait pas explicitement. En fonction de la fonction JPA de Liberty que vous utilisez (car ils utilisent différentes implémentations JPA), l'une de ces propriétés est requise:

<!-- allow table definitions/creation on-the-fly jpa-2.0 feature --> 
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" /> 
<!-- allow table definitions/creation on-the-fly jpa-2.1 feature --> 
<property name="eclipselink.ddl-generation" value="create-tables"/> 
+0

Merci pour votre réponse. Oui mais n'utilise pas sql? Comme où dit-on de créer réellement une table? si je viens d'ajouter cette valeur, il le fera automatiquement? Et comment le code sait quelle table je veux qu'il crée? Où associe-t-il qu'il devrait créer la table TODO? – Daiane

+1

SQL est utilisé, mais vous ne pouvez pas voir la commande réelle, sauf si vous activez le suivi. Le serveur le fait pour vous lorsque vous accédez à l'application pour la première fois. Je pense qu'il sait quelles tables créer en fonction de l'annotation @Table dans la classe TODO. – opiethehokie