JPA wraz z Apache Derby

0

Witam

Próbuję napisać prostą aplikację z wykorzystaniem Apache Derby i JPA. Do tej pory korzystałem z MySQL-a i nie miałem tego problemu, o którym napiszę.

Oto DDL-e które mam na bazie:

create table kind(id int primary key, description varchar(255));
create table quotation(id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), kind_id int, author varchar(256), origin varchar(255), tag varchar(512), insertion_date date, content long varchar, CONSTRAINT kind_id_cons FOREIGN KEY (kind_id) REFERENCES kind (id), CONSTRAINT quotation_primary_key PRIMARY KEY (id));

Taki mam plik 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="TrzmielPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>org.nuclearblast.trzemiel.entity.Quotation</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:/ApacheDerby/App"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>    
    </properties>
  </persistence-unit>
</persistence>

Encja Quotation:

package org.nuclearblast.trzemiel.entity;

import java.io.Serializable;
import java.sql.Date;
import javax.persistence.*;

@Entity
public class Quotation implements Serializable {
    
    private static final long serialVersionUID = 1L;
  
    @Id
    private Long id;
    private String author;
    private String origin; 
    private String tag; 
    @Column(name="INSERTION_DATE")
    private Date insertionDate; 

    public Long getId() {
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Date getInsertionDate() {
        return insertionDate;
    }

    public void setInsertionDate(Date insertionDate) {
        this.insertionDate = insertionDate;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }
       
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Quotation)) {
            return false;
        }
        Quotation other = (Quotation) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "org.nuclearblast.trzemiel.entity.Quotation[ id=" + id + " ]";
    }
}

Podczas wstawiania Quotation do bazy otrzymuję (nie ustawiam id na obiekcie):

Caused by: javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Próba modyfikowania kolumny tożsamości 'ID'. 
Error Code: 20000
Call: INSERT INTO QUOTATION (ID, AUTHOR, INSERTION_DATE, ORIGIN, TAG) VALUES (?, ?, ?, ?, ?)
	bind => [5 parameters bound]
Query: InsertObjectQuery(org.nuclearblast.trzemiel.entity.Quotation[ id=null ])

A gdy oznaczę pole id: @GeneratedValue(strategy = GenerationType.AUTO)

i zmienię ddl:a na (bez auto inkrementacji):

create table quotation(id int primary key, kind_id int, author varchar(256), origin varchar(255), tag varchar(512), insertion_date date, content long varchar, CONSTRAINT kind_id_cons FOREIGN KEY (kind_id) REFERENCES kind (id));

Dostaję:

 
Internal Exception: java.sql.SQLSyntaxErrorException: Tabela/widok 'SEQUENCE' nie istnieje.
Error Code: 20000
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
	bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")

po wykonaniu show tables:

ij> show tables;
TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------
SYS                 |SYSALIASES                    |
SYS                 |SYSCHECKS                     |
SYS                 |SYSCOLPERMS                   |
SYS                 |SYSCOLUMNS                    |
SYS                 |SYSCONGLOMERATES              |
SYS                 |SYSCONSTRAINTS                |
SYS                 |SYSDEPENDS                    |
SYS                 |SYSFILES                      |
SYS                 |SYSFOREIGNKEYS                |
SYS                 |SYSKEYS                       |
SYS                 |SYSPERMS                      |
SYS                 |SYSROLES                      |
SYS                 |SYSROUTINEPERMS               |
SYS                 |SYSSCHEMAS                    |
SYS                 |SYSSEQUENCES                  |
SYS                 |SYSSTATEMENTS                 |
SYS                 |SYSSTATISTICS                 |
SYS                 |SYSTABLEPERMS                 |
SYS                 |SYSTABLES                     |
SYS                 |SYSTRIGGERS                   |
SYS                 |SYSVIEWS                      |
SYSIBM            |SYSDUMMY1                     |
APP                 |KIND                          |
APP                 |POEM                          |
APP                 |QUOTATION                     |
ij>

Czy ktoś może mi podpowiedzieć co mam zrobić ?

Generalnie zależy mi na tym abym nie musiał samodzielnie wprowadzać wartość pola id.

Dzięki wielkie :)

0

Jeśli problem aktualny to dodaj sobie w klasie encji adnotację @GeneratedValue(strategy=GenerationType.IDENTITY):

@Id
@Basic(optional = false)
@Column(name = "ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)  
private Integer id;

PS: Dla Dobosza kodzisz :D ???

1 użytkowników online, w tym zalogowanych: 0, gości: 1