昨天遇到问题我无法连接到derby数据库(很可能是由于persistence.xml问题)我被引导修改我的persistence.xml,以便它包含两个额外的poperties;
<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.
虽然现在一切都会好起来,但我意识到情况并非如此。首先,我试图通过实体管理器的.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 Entity 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 :(得分:0)
我注意到数据库中没有插入任何内容......但是,尝试执行.find()来查找刚刚插入的主键(testts123s),它已经找到了记录。
您是如何注意到数据库中没有插入任何内容的?读你的下一句话看起来就像是。
不管
您应该避免使用本机SQL插入记录。首先要做到这一点,你绕过缓存,它可能会给你带来真正的头痛,最后它打破了整个ORM的想法。 所以相反,你最好用实体管理器的持久化方法来做。
Userbay user = new Userbay();
user.setFirstName("Firstname");
user.setLastName("Lastname");
user.setPassword("password");
user.setEmail("someemail@email.zzz");
emgr.persist(user);
就您选择生成userName而言,它将为您生成。
以防万一: 请记住,即使您没有打开任何事务,当您调用registerUser方法时,容器会为您打开一个。这意味着您正在同一个事务中工作,直到该方法以其暗示的所有内容结束。以下是Oracle教程
的摘录Required属性是使用容器管理的事务划分运行的所有企业bean方法的隐式事务属性。除非需要覆盖其他事务属性,否则通常不会设置Required属性。由于事务属性是声明性的,因此您可以在以后轻松更改它们。
您可能希望至少阅读这些部分以便更好地理解。
答案 1 :(得分:0)
经过几天的persistence.xml搞砸了我很幸运找到了一个oracle教程,它指导为glassfish服务器创建一个新的JDBC连接池和资源,以链接derby数据库。完成之后,我需要将所有内容放在persistence.xml中的是JTA数据源。
以下是我从头开始做的视频,这次是选择ClientDriver - http://www.youtube.com/watch?v=xBNB8L49ZQ4