을 받고 javax.지속성을 알려준다.TransactionRequiredException 컨테이너에서 관리되는 엔티티 Manager
문제
안녕하세요 만들어 간단한 JSF
+ JPA
응용 프로그램.웹 응용 프로그램의 Entity
, 이, ManagedBean
부 JSF
페이지입니다.그것은 목적을 생성하고 저장하는 개체에 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.그것은 쉽게 당신을 걱정할 필요가 없에 대한 트랜잭션이 있습니다.컨테이너 제어할 수 있습니다.