을 받고 javax.지속성을 알려준다.TransactionRequiredException 컨테이너에서 관리되는 엔티티 Manager

StackOverflow https://stackoverflow.com//questions/24001269

  •  20-12-2019
  •  | 
  •  

문제

안녕하세요 만들어 간단한 JSF + JPA 응용 프로그램.웹 응용 프로그램의 Entity, 이, ManagedBeanJSF 페이지입니다.그것은 목적을 생성하고 저장하는 개체에 MySQL 데이터베이스입니다.나 javax.persistence.TransactionRequiredException 시간 지속하고 싶은 엔터티로 PersistenceContxt.그러나 때사 UserTransaction 컨트롤러 클래스 작동하지 않고 어떤 문제이지만,내가 이해할 수 없는 이유?되어 있으므로 필요하지 않 추가 UserTransaction 기 때문에 그것은 컨테이너 관리.내가 잘못된 또는 무엇인가?또는 있는 기타 문제 내 코드는?

여기에 내 ManagedBean 코드:

@ManagedBean
@SessionScoped
public class Controller {
    @PersistenceContext
    private EntityManager em;
    private Book book;
    public Controller() {}

    public Book getBook() {
        return book;
    } 

    public void setBook(Book book) {
        this.book = book;
    }

    public String createBook() {
        book = new Book();
        return "create";
    }

    public String showResponse() {
        em.persist(book);
        return "response";
    }
}

create.xhtml facelet:

...
<h:form>
    <h:panelGrid columns="2">
        <h:outputText>Title</h:outputText>
        <h:inputText value="#{controller.book.title}" />
    </h:panelGrid>
</h:commandButton action="#{controller.showResponse()}" value="Response" />
...

Persistence.xml 콘텐츠:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="JPATestPU" transaction-type="JTA">
    <jta-data-source>jdbc/mysql</jta-data-source>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
</persistence>
도움이 되었습니까?

해결책

트랜잭션이 자동으로 만들어지는 유일한 방법에 EJB,지 manged 콩입니다.는 경우에 JEE7 컨테이너 시도할 수 있습니다 추가@트랜잭션 컨트롤러 bean,그렇지 않으면 당신은 당신을 사용할 필요가 UserTransation 를 관리하는 트랜잭션이 있습니다.

여기에는 코드는데 사용:

@Transactional
public class PersonService {
    @PersistenceContext 
    private EntityManager em;

    public void savePerson(Person person) {
    em.persist(person);
}

와 나에서 호출은 서비스:

 @WebServlet("/MyServlet")
 public class MyServlet extends HttpServlet {
    @Inject
    PersonService service;
  ....
  service.savePerson(p);
  System.out.println("Person saved");

에서 볼 수 있는 데이터베이스에 저장된,그리고 로그에 나는 다음 메시지를 참조하십시오:

INFO: Managed bean with Transactional annotation and TxType of REQUIRED called outside a transaction context.  Beginning a transaction...
INFO: Person saved

그래서 당신이 볼 수 있는 새로운 트랜잭션이 crated 및 객체 저장

다른 팁

을 보면서 코드.내 생각에 이것은 오히려 디자인 문제보다는 기술적 문제입니다.제안 고려해야 하는 구조 응용 프로그램으로 따른다:1.데이터베이스 계층-MySql.2.체 패키지에 포함되어 엔티티는 개체 맵으로 직접 데이터베이스 테이블이 있습니다.3.데이터 액세스 개체 패키지 포함 Ejb(예:@Singleton,@,무@상태 저장).4.컨트롤러 패키지 포함 servlet 및/또는 관리 콩여 액세스할 수 있는 프레젠테이션을 통해 레이어 EL(예:@이름,@ConversionScoped,@ManagedBean,etc.) 5.Presentation layer-JSF 페이지(예를들면인덱스이다.xhtml,etc.)

그것은 중요한 코드를 구성하기 때문에 이러한 방식으로 거래 보안 및 다른 서비스는 자동으로 제공됩 Ejb 는 지속 수행해야 합니다.즉,참조하여 entitymanager 를(을 통해@PersistenceContext)에 있어야 합니다 Ejb 지 관리 콩 개체입니다.체에서 컨트롤러를 사용해야@Inject(@EJB)주석을 inject 종속성입니다.

지 않는 한 당신의 가동을 읽을 데이터베이스에서,단 한 가지 당신이 필요로하는"@트랜잭션"주석의 방법입니다.또한 당신은 그것을 정의할 수 있는 위의 클래스입니다.하지만 적당한 건물입니다.에 적어도 당신은 당신을 만들어야 다른 클래스 주입에 빈입니다.

를 사용하는 경우 JavaEE 사용해야 합니다 EJB.그것은 쉽게 당신을 걱정할 필요가 없에 대한 트랜잭션이 있습니다.컨테이너 제어할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top