2014-02-25 66 views
0

昨天有一个问题,我无法连接到derby数据库(很可能是由于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 existUnknown 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(); 

我注意到,没有被插入到数据库中。不过有试图执行.find()找到我刚插入(testts123s)主键已经找到了记录(虽然在数据源资源管理器数据库的表没有填充此记录)。因此,我的问题是发生了什么,我被连接到一个空表?

以下是代码;

的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 SessionBean的

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实体Bean

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

你有这个插入之后的任何异常?如果你使用JPA,如果你真的不需要它,尽量不要使用本地查询。 –

+0

第一次插入没有任何问题,但第二次尝试它有以下异常(因此为什么它现在被注释掉) - org.apache.derby.client.am.SqlException:语句被中止,因为它会导致'USERBAY'上定义的'SQL140225111513480'标识的唯一或主键约束或唯一索引中的重复键值。附:它仅用于测试目的,并让我意识到我绝对不会处理我期望的表格。 – Adrian

+0

因此可能代码的生成不起作用。尝试从数据库中删除此行并再次执行它。如果一切正常,并且只有在第二次插入时出现问题,则意味着您在生成ID时出现问题。然后试着改变generatedValue策略。 –

回答

0

后用的persistence.xml乱搞的日子里,我幸运地找到一个Oracle教程引导创建GlassFish服务器新的JDBC连接池和资源,到德比链接数据库。完成之后,我需要将所有内容放入persistence.xml中,这是JTA数据源。

这里就是我从从头开始做了一个视频,这次选择ClientDriver - http://www.youtube.com/watch?v=xBNB8L49ZQ4

0

我注意到,没有被插入到数据库中。不过尝试过执行.find()来查找一个pr我刚插入的imary键(testts123s)已经找到记录。

您究竟发现了什么都没有插入到数据库中?读下你的下一句话,它看起来像是。

无论如何

您应该避免使用原生SQL插入记录。首先这样做是为了绕过缓存,它可能会给你带来真正的头痛,并最终破坏ORM的整个想法。 所以相反,你最好用坚持实体经理的方法做到这一点。

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

emgr.persist(user); 

只要您选择生成userName它将为您生成。

以防万一: 请记住,即使您未打开任何事务,当您调用registerUser方法时,容器为您打开一个事务。这意味着你正在同一个事务中工作,直到方法以它所暗示的一切结束。以下摘录自Oracle教程

Required属性是所有使用容器管理的事务分界运行的企业bean方法的隐式事务属性。除非需要重写另一个事务属性,否则通常不会设置Required属性。因为事务属性是声明性的,所以以后可以轻松更改它们。

您可能要阅读至少这些部分以便更好地理解。

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

你试过坚持办法吗? – jjd

相关问题