0

昨日、derby データベースに接続できないという問題がありました (おそらく persistence.xml の問題が原因です)。persistence.xml を変更して、2 つの追加の poperty を含めるように案内されました。

<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() メソッドを使用して、データベースから行の 1 つを取得しようとしていました。データベースからレコードを取得するためのテストをしばらく行った後、データベースに何かを挿入して何が起こるかを確認したほうがよいのではないかと思いました。次のコード行を実行しました。

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>

UserRegistrationSessionBean

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;
    }

}

ユーザーベイ エンティティ 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;
    }

}
4

2 に答える 2

0

データベースに何も挿入されていないことに気付きました...しかし、.find() を実行して、挿入したばかりの主キー (testts123s) を見つけようとすると、レコードが見つかりました。

データベースに何も挿入されていないことにどのように気づきましたか? 次の文を読むと、そうだったようです。

関係なく

ネイティブ SQL を使用してレコードを挿入することは避けてください。まず第一に、これを行うとキャッシュをバイパスします。これは本当に頭痛の種になる可能性があり、最終的には ORM の概念全体が壊れてしまいます。代わりに、エンティティ マネージャーの persist メソッドを使用することをお勧めします。

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 属性を設定しません。トランザクション属性は宣言型であるため、後で簡単に変更できます。

理解を深めるために、少なくともこれらのセクションを読むことをお勧めします。

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

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

于 2014-02-26T09:00:18.960 に答える