1

Netbeans で JPA 2.0 を使用しています。エンティティを使用しています。データベースにテーブルがない場合、エンティティからテーブルを作成する必要があります。これが私のコードです

public class BankServlet extends HttpServlet {

     @EJB
     private BankServiceBeanRemote bankServiceBean;

     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

        int custId = Integer.parseInt(request.getParameter("id"));

        bankServiceBean.createCustomers();
        Customer cust = bankServiceBean.findCustomer(custId);

        response.setContentType("text/html;charset=UTF-8");
        ....

    } //end of processRequest

} //end of class BankServlet

これが私の豆です

@Stateless
public class BankServiceBean implements BankServiceBeanRemote {

    @PersistenceContext(unitName = "Bank_JPA-ejbPU")
    private EntityManager em;

    @Override
    public void createCustomers() {

        Referee r1 = new Referee();
        r1.setId(1);
        r1.setName("SIR JOHN DEED");
        r1.setComments("JUDGE");     
        em.persist(r1);

        Customer c1 = new Customer();
        c1.setId(1);
        c1.setFirstName("SIMON");
        c1.setLastName("KING");
        c1.setReferee(r1);

        ......
    }

} //end of class BankServiceBean

これが私の審判エンティティです

@Entity
public class Referee implements Serializable {

    private static final long serialVersionUID = 1L;

    private int id;
    private String name;
    private String comments;

    public Referee() {

    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    // other getter setters

} //end of class Referee

コードを実行すると、次の例外が発生します

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600):     org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table     'dbbank.referee' doesn't exist
Error Code: 1146
Call: INSERT INTO REFEREE (ID, NAME, COMMENTS) VALUES (?, ?, ?)
    bind => [3, MICHAEL ELLIS, MAJOR SHAREHOLDER OF THIS BANK]
Query: InsertObjectQuery(pk.mazars.basitMahmood.entity.Referee[id=3])
    at     org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)

テーブルが存在しない場合は、テーブルを自動的に作成する必要があります。私は何か間違ったことをしていますか?

ありがとうございました

4

3 に答える 3

1

persistence.xmlでテーブル生成戦略を変更する必要があります。

これらの行をpersistence.xmlファイルに追加するだけです。

<properties>
  <property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
于 2013-02-06T13:08:13.617 に答える
1

以下は、 openjpaにテーブルを作成させるために、persistence.xml に追加するスニペットです。これは、HyperSQL のようなメモリ内データベースで openejb を使用してコンテナ単体テストを行う場合に便利です。

    <properties>
         <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
    </properties>
于 2014-02-05T19:21:20.673 に答える
1

あなたの仮定は間違っています。テーブルが存在しない場合、テーブルは魔法のように作成されません。ほとんどのアプリケーションは、既存のデータベースを使用します。

TopLinkでスキーマを作成できますが、これはデフォルトではありません。この機能を有効にする方法については、このページをお読みください。

EclipseLink を使用して、永続性ユニットのテーブルとデータベース スキーマを自動的に生成できます。これは、「eclipselink.ddl-generation」持続性ユニット プロパティを介して行われ、「create-tables」または「drop-and-create-tables」に設定されます。テーブルと制約は、その持続性ユニットで定義されたすべてのクラスに対して生成されます。

于 2012-09-12T10:45:01.183 に答える