2016-03-21 7 views
0

Я создаю таблицу и последовательность в PostgreSQL:Glassfish объект не сохраняется

CREATE SEQUENCE 
    test_id 
INCREMENT 1 
START 1 
MAXVALUE 500; 
CREATE TABLE TEST(
    id    NUMERIC PRIMARY KEY DEFAULT NEXTVAL('test_id'), 
    name    TEXT NOT NULL UNIQUE, 
    name2    TEXT DEFAULT NULL 
); 

Затем я генерировать объект в Eclipse:

@Entity 
@NamedQuery(name="Test.findAll", query="SELECT t FROM Test t") 
public class Test implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private long id; 
    private String name; 
    private String name2; 

    public Test() { 
    } 


    @Id 
    @SequenceGenerator(name="TEST_ID_GENERATOR", sequenceName="TEST_ID", allocationSize=1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TEST_ID_GENERATOR") 
    public long getId() { 
     return this.id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 


    public String getName() { 
     return this.name; 
    } 

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


    public String getName2() { 
     return this.name2; 
    } 

    public void setName2(String name2) { 
     this.name2 = name2; 
    } 

} 

Тогда я пытаюсь написать свою сущность в таблице из сервлета:

@PersistenceUnit(name="Tets") 
EntityManagerFactory emf; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     EntityManager em = emf.createEntityManager(); 
     Test t = new Test(); 

     t.setName("jdsfjjd"); 
     t.setName2("jdsfjjd"); 
     em.persist(t); 

     response.getWriter().append("Served at: ").append(request.getContextPath()); 
    } 

Когда я развертываю свой проект и использую этот сервлет, я не вижу журналы. Проект запускает сервлет запуска, в браузере я вижу: Served at: /Tets, но когда я проверяю таблицу, я не вижу там своего объекта. Что я делаю не так?

+0

добавить 'em.flush()' после 'em.persist (..)' – Jens

+0

я добавить и поймать javax.persistence.TransactionRequiredException: Exception Описание: Нет внешнее управление транзакция активна в данный момент для данного потока – JugerJuger

+0

Вы должны настроить менеджера транзакций – Jens

ответ

0

Короткий ответ: вы неправильно используете управляемый EntityManager.

Когда вы внедряете EntityManager в среду Java EE, он контролируется вашим контейнером IoC (это почти всегда EJB или CDI). Контейнер обрабатывает распространение сделок и демаркацию по методе бизнес вызова какое-либо ручные действия в случае транзакционных механизмов ненужными:

@PersistenceContext 
private EntityManager em; 
... 
@TransactionAttribute(REQUIRES_NEW) 
public void someMethod(Bean b) { 
    em.persist(b); 
} // Transaction gets committed and em gets flushed with no extra work 

Когда вы вместо того, чтобы вводить в EntityManagerFactory, вся магия не будет. В этом случае вам необходимо выполнить транзакционное связывание вручную. Вы ничего не делаете, и именно по этой причине вы получаете TransactionRequiredException. Исходный пример ничего не выбрасывает, потому что не будет флеша без активной транзакции, поэтому ваши изменения будут игнорироваться. Это будет выглядеть так:

@Resource 
private UserTransaction t; 
... 
t.begin(); 
emf.createEntityManager().persist(bean); 
t.commit(); 

В этом случае я хотел бы предложить вам использовать передовой опыт в отрасли, используя EntityManager инъекции в сочетании с некоторым безгосударственным бобом для поддержания нити небезопасности ЭМ. Затем введите EJB в этот сервлет и сделайте то, что вам нужно.

Другим способом было бы ввести UserTransaction и вызвать его метод begin() явно. UserTransaction не объявляется потокобезопасным, поэтому вам потребуется какая-то синхронизация вокруг его использования. Это, безусловно, убьет всю производительность, поэтому я предлагаю вам вернуться к первому варианту.