2015-09-30 7 views
1
.

. В настоящее время я изучаю пример кода из приложения JavaB Web Starter приложения Boilerplates Java DB, и у меня возникают проблемы с изменением таблицы. Моя БД готова и работает там. Я попытался изменить код вместо того, чтобы попасть из таблицы, чтобы попасть из таблицы. Вот картина того, как я изменил его на код:Измените таблицы из Boilerplates. Пример кода Java DB Web Starter на 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; 
    } 

} 

Я также не мог найти, где это создает таблицу TODO, когда оно не существует в моей дб.

Спасибо

+0

Можете ли вы рассказать о том, какие проблемы у вас есть? Я не вижу ничего плохого в ваших изменениях, поэтому сообщение об ошибке, вероятно, поможет. – opiethehokie

+0

Это намного лучше, если вы действительно добавляете сам код, а не добавляете код в качестве изображений. Никто не собирается вводить этот код. Вам нужно облегчить людям помощь, поэтому рекомендуется создать [mcve] (http://stackoverflow.com/help/mcve) – kkuilla

+0

Итак, я редактировал свой вопрос добавление кодов. У меня есть таблица на bluemix с именем country с двумя столбцами: country_id (int) и country_name (varchar). Я загрузил образец кода веб-стартера JavaDB, и когда я побежал, он создал таблицу todolist на моем db. Что я пытаюсь сделать с кодом, так это понять, как он взаимодействует с моим db, поэтому я хотел изменить таблицу todolist на таблицу моей страны. Я сделал эти изменения, которые я показал в двух классах, и теперь это дает мне ошибку. Я новичок в bluemix, и я пытаюсь создать приложение с java и db. Цените помощь. :) – Daiane

ответ

3

создание Таблица конфигурируется в файле persistence.xml в шаблонный в. JPA может создать его для вас, поэтому приложение явно не делает этого. В зависимости от того, какую функцию Liberty JPA вы используете (потому что они используют разные реализации JPA), необходимо одно из этих свойств:

<!-- 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

Спасибо за ваш ответ. Да, но он не использует sql? Как там, где он говорит, чтобы создать таблицу? если я просто добавлю это значение, он автоматически это сделает? И как код знает, какую таблицу я хочу создать? Где это связывает, что он должен создать таблицу TODO? – Daiane

+1

Используется SQL, но вы не видите фактическую команду, если вы не включили трассировку. Сервер делает это для вас, когда приложение впервые открывается. Я думаю, он знает, какие таблицы следует создавать на основе аннотации @Table в классе TODO. – opiethehokie