2014-02-25 4 views
0

에 연결되지 않습니다. (대부분 persistence.xml 문제로 인해) 내 persistence.xml을 수정하도록 안내되었습니다. 그래서 그것은 두 개의 추가 특성을 포함한다;EJB 프로젝트가 더비 데이터베이스에 연결할 수 없다는 어제 문제점이있는 오른쪽 Derby 데이터베이스/테이블

<property name="eclipselink.ddl-generation" value="create-tables" /> 
<property name="eclipselink.ddl-generation.output-mode" value="database" /> 

는 우선에 .. 나는 그런 모든 것이 지금 잘 될 것입니다하지만, 내가 그 경우가 실현 갖는 SCHEMA "xx" doesn't exist 또는 Unknown entity bean class: class model.Userbay, please verify that this class has been marked with the @Entity annotation.

같은 오류의 무리에 직면되지 않습니다를 추가 한 데 Entity Manager의 .find() 메소드를 통해 데이터베이스에서 행 중 하나를 가져 오려고 시도했습니다. 데이터베이스에서 레코드를 검색하기 위해 테스트를 한 후에 데이터베이스에 레코드를 삽입하고 어떤 일이 발생하는지 보려고하는 것이 좋습니다. 다음 코드 행을 실행했습니다.

emgr.createNativeQuery("insert into ADRIAN.USERBAY (USER_NAME, PASSWORD, EMAIL, FIRST_NAME, LAST_NAME) values('testts123s', '1', '1', '1', '1')").executeUpdate(); 

나는 그것이 데이터에 있지만 (기록을 발견했다() 난 그냥 (testts123s)를 삽입 기본 키를 찾을 수 아무것도 그러나 .find을 실행하려고 가지고 ... 데이터베이스에 삽입되지 않은 것으로 나타났습니다 소스 탐색기에서 데이터베이스의 테이블에이 레코드가 채워지지 않았습니다. 그러므로 내 질문은 내가 빈 테이블에 연결되었다는 것입니다.

다음은 코드입니다.

의 persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="EJBAuctionv2"> 
    <!-- <jta-data-source>JDBC/MyDB</jta-data-source> --> 
     <class>model.Userbay</class> 
     <class>model.Item</class> 
     <class>model.Category</class> 

     <properties> 
    <property name="javax.persistence.jdbc.password" value="123" /> 
    <property name="javax.persistence.jdbc.user" value="adrian" /> 
    <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeededDriver" /> 
    <property name="javax.persistence.jdbc.url" value="jdbc:derby:C:\Users\Adrian\MyDB;create=true" /> 
<!-- <property name="eclipselink.ddl-generation" value="create-tables" /> 
<property name="eclipselink.ddl-generation.output-mode" value="database" /> --> 
    </properties> 
    </persistence-unit> 
</persistence> 

UserRegistration 세션빈

package auction; 

import javax.ejb.EJB; 
import javax.ejb.LocalBean; 
import javax.ejb.Remote; 
import javax.ejb.Singleton; 
import javax.ejb.Stateful; 
import javax.ejb.Stateless; 
import javax.management.Query; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import model.Userbay; 

/** 
* Session Bean implementation class userRegistrationSB 
*/ 
@Remote @Stateless 
public class userRegistrationSB implements userRegistrationSBRemote { 

    //@EJB private Userbay user; 
    @PersistenceContext(name = "EJBAuctionv2") private EntityManager emgr; 
    /** 
    * Default constructor. 
    */ 
    public userRegistrationSB() {} 

    @Override 
    public boolean registerUser(String username, String password, String email, 
      String firstname, String lastname) { 
     boolean registered = false; 

     //emgr.createNativeQuery("insert into ADRIAN.USERBAY (USER_NAME, PASSWORD, EMAIL, FIRST_NAME, LAST_NAME) values('testts123s', '1', '1', '1', '1')").executeUpdate(); 

     System.out.println("Registering an user with username: " + username); 
     Userbay user = emgr.find(model.Userbay.class, username); 
     if (user == null) { 
      System.out.println("Username doesn't exist."); 
      registered = true; 
     } else { 
      registered = false; 
      System.out.println("Username already exists."); 
     } 

     return registered; 
    } 

    @Override 
    public boolean userExists(String username) { 
     return false; 
    } 

    @Override 
    public boolean userMatchesPassword(String username, String password) { 
     return false; 
    } 

} 

Userbay 엔티티 빈

package model; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.util.List; 




@Entity @Table (name = "Userbay") 
@NamedQuery(name="Userbay.findAll", query="SELECT u FROM Userbay u") 
public class Userbay implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id @GeneratedValue (strategy = GenerationType.TABLE) 
    @Column(name="USER_NAME") 
    private String userName; 

    private String email; 

    @Column(name="FIRST_NAME") 
    private String firstName; 

    @Column(name="LAST_NAME") 
    private String lastName; 

    @Column(name="PASSWORD") 
    private String password; 

    //bi-directional many-to-one association to Item 
    @OneToMany(mappedBy="userbay") 
    private List<Item> items; 

    public Userbay() { 
    } 

    public String getUserName() { 
     return this.userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public String getEmail() { 
     return this.email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getPassword() { 
     return this.password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public List<Item> getItems() { 
     return this.items; 
    } 

    public void setItems(List<Item> items) { 
     this.items = items; 
    } 

    public Item addItem(Item item) { 
     getItems().add(item); 
     item.setUserbay(this); 

     return item; 
    } 

    public Item removeItem(Item item) { 
     getItems().remove(item); 
     item.setUserbay(null); 

     return item; 
    } 

} 
+0

이 삽입 후 예외가 있나요 -

은 여기에서, ClientDriver를 선택하는이 시간 나는 처음부터했을 비디오입니까? JPA를 사용한다면 실제로 네이티브 쿼리를 사용하지 않으려 고 시도하십시오. –

+0

처음 삽입 할 때 아무런 문제가 없었지만 두 번째 시도는 다음과 같은 예외가있었습니다 (따라서 지금 주석 처리 된 이유는 무엇입니까?) - org.apache.derby.client.am.SqlException :이 때문에 명령문이 중단되었습니다 고유 또는 1 차 키 제한 조건의 중복 키 값 또는 'USERBAY'에 정의 된 'SQL140225111513480'에 의해 식별 된 고유 색인. 추신 그것은 테스트 목적으로 만 사용되었고 내가 예상했던 테이블을 확실히 다루지 않는다는 것을 깨달았습니다. – Adrian

+0

아마 id 생성이 작동하지 않을 것입니다. 이 행을 데이터베이스에서 제거하고 다시 한 번 실행하십시오. 모든 것이 정상이고 두 번째 삽입 중에 만 문제가 발생하면 ID를 생성하는 데 문제가 있음을 의미합니다. 예를 들어 generatedValue 전략을 변경하십시오. –

답변

0

나는 아무것도 그러나 ... 데이터베이스에 삽입되지 않은 시도 한 것으로 나타났습니다 .find()를 실행하여 pr을 찾습니다. imary key 난 그냥 삽입 (testts123s) 그것은 레코드를 발견했다.

정확히 아무것도 데이터베이스에 삽입되지 않았다는 것을 알았습니까? 다음 문장을 읽은 것처럼 보입니다.

에 관계없이

당신은 네이티브 SQL 레코드를 삽입하지 않도록해야합니다. 우선이 작업을 수행하면 캐시를 우회하여 실제 두통을 초래할 수 있으며 마침내 ORM의 전체 아이디어가 깨집니다. 대신 엔티티 관리자의 persist 메소드를 사용하는 것이 좋습니다.

Userbay user = new Userbay(); 
user.setFirstName("Firstname"); 
user.setLastName("Lastname"); 
user.setPassword("password"); 
user.setEmail("[email protected]"); 

emgr.persist(user); 

지금까지 당신이 당신을 위해 생성됩니다 이름을 생성하기 위해 선택한다.

혹시라도 : 트랜잭션을 열지 않아도 registerUser 메소드를 호출 할 때 컨테이너가 컨테이너를 열었습니다. 메서드가 의미하는 모든 것으로 끝날 때까지 동일한 트랜잭션에서 작업하고 있음을 의미합니다. 아래는 오라클 튜토리얼에서 발췌 한 것입니다.

필수 속성은 컨테이너 관리 트랜잭션 구분으로 실행되는 모든 엔터프라이즈 bean 메소드의 암시 적 트랜잭션 속성입니다. 일반적으로 다른 트랜잭션 속성을 재정의해야하는 경우가 아니면 Required 속성을 설정하지 않습니다.트랜잭션 속성은 선언적이므로 나중에 쉽게 변경할 수 있습니다.

더 많은 정보를 얻으려면이 섹션을 읽어보십시오. 나는 다행히 글래스 피쉬 서버에 대한 새 JDBC 연결 풀 및 자원을 만들 안내하는 오라클 튜토리얼을 발견 한 persistence.xml을 함께 장난의 일 후에

http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html

http://docs.oracle.com/javaee/6/tutorial/doc/bncih.html

+0

"데이터베이스에 아무것도 삽입되지 않았습니다."라는 뜻의 잘못된 설명은 내 스키마 ADRIAN - Userbay 테이블에 아무 것도 삽입되어 있지 않다는 것을 의미합니다. 데이터베이스에 존재하는 다른 스키마에도 삽입되지 않았습니다. 삽입 된 값인 testts123s를 검색 할 수 있다고 말하면서, "testts123s"를 삽입하기 전에 비어있는 테이블을 다루었 기 때문에 사실입니다. 따라서 필자의 가정은 내가 원한 데이터베이스와 연결되지 않은 새 테이블이 만들어졌으며 결론은 내가 어떤 스키마/데이터베이스를 처리하는지 알지 못한다는 것입니다. – Adrian

+0

당신은 persist 방법을 시도 했습니까? – jjd