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 :)