Имам таблица на база данни Derby със следните полета. Полетата за ID на базата данни автоматично се генерират и увеличават.
create table "Yaya".SERVICELOG
(
ID INTEGER default AUTOINCREMENT: start 1 increment 1 not null primary key,
TXTIME TIMESTAMP,
EVENTLEVEL INTEGER,
EVENTTYPE VARCHAR(255),
DESCRIPTION VARCHAR(4096)
)
С помощта на NetBeans се опитвам да използвам Hibernate като ORM. Използвал съм Linq2SQL и EF преди... Това става травматично.
Ето моя генериран POJO, вярвам, че анотациите са правилни.
// Generated Sep 19, 2014 12:26:20 PM by Hibernate Tools 4.3.1
import java.util.Date;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* Servicelog generated by hbm2java
*/
public class Servicelog implements java.io.Serializable {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private Date txtime;
private Integer eventlevel;
private String eventtype;
private String description;
public Servicelog() {
}
public Servicelog(int id) {
this.id = id;
}
public Servicelog(int id, Date txtime, Integer eventlevel, String eventtype, String description) {
this.id = id;
this.txtime = txtime;
this.eventlevel = eventlevel;
this.eventtype = eventtype;
this.description = description;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public Date getTxtime() {
return this.txtime;
}
public void setTxtime(Date txtime) {
this.txtime = txtime;
}
public Integer getEventlevel() {
return this.eventlevel;
}
public void setEventlevel(Integer eventlevel) {
this.eventlevel = eventlevel;
}
public String getEventtype() {
return this.eventtype;
}
public void setEventtype(String eventtype) {
this.eventtype = eventtype;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
}
Ето моят код за вмъкване.
Session session = StartupBean.sessionFactory.openSession();
session.beginTransaction();
Servicelog sl = new Servicelog();
sl.setDescription("IN IT TO WIN IT");
session.save(sl);
session.getTransaction().commit();
session.close();
Той бомбардира със следното в сървърната конзола на glassfish на session.getTransaction().commit();
Информация: HHH000041: Конфигуриран SessionFactory: null WARN: HHH000402: Използване на вграден пул за свързване на Hibernate (не за производствена употреба!) Информация: HHH000401: използване на драйвер [org.apache.derby.jdbc.ClientDriver] на URL [jdbc:derby: //localhost:1527/yayadb] Информация: HHH000046: Свойства на връзката: {user=yayaadmin, password=****} Информация:
HHH000006: Режим на автоматично подаване: невярно Информация: HHH000115: Размер на пула за връзка за хибернация: 20 (мин. =1) Информация: HHH000400: Използване на диалект: org.hibernate.dialect.DerbyDialect WARN: HHH000430: Диалектът DerbyDialect е отхвърлен; вместо това използвайте един от специфичните за версията диалекти Информация: HHH000399: Използване на стратегия за транзакции по подразбиране (директни JDBC транзакции) Информация: HHH000397: Използване на ASTQueryTranslatorFactory Информация: Зареждане на приложение [yaya] в [/yaya] Информация: yaya беше успешно внедрено за 6323 милисекунди.ПРЕДУПРЕЖДЕНИЕ: SQL грешка: -1, SQLState: 42Z23
ГРЕШКА: Опит за промяна на колона за идентичност „ID“.
Причинено от: java.sql.SQLSyntaxErrorException: Опит за промяна на колона за идентичност „ID“.
в org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Неизвестен източник) в org.apache.derby.client.am.SqlException.getSQLException(Неизвестен източник) в org.apache.derby.client.am.Connection.prepareStatement (Неизвестен източник) в org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:103) в org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) . .. още 45 Причинено от: org.apache.derby.client.am.SqlException: Опит за промяна на колона за идентичност „ID“. в org.apache.derby.client.am.Statement.completeSqlca(Неизвестен източник) в org.apache.derby.client.net.NetStatementReply.parsePrepareError(Неизвестен източник) в org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTReply (Неизвестен източник) в org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Неизвестен източник) в org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Неизвестен източник) в org.apache.derby.client.net .NetStatement.readPrepareDescribeOutput_(Неизвестен източник) в org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Неизвестен източник) в org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(Неизвестен източник) в org.apache.derby .client.am.PreparedStatement.flowPrepareDescribeInputOutput(Неизвестен източник) в org.apache.derby.client.am.PreparedStatement.prepare(Неизвестен източник) в org.apache.derby.client.am.Connection.prepareStatementX(Неизвестен източник) .. , още 48
Занимавам се с него от няколко часа и нямам идея как да продължа. Какво трябва да променя в хибернация, така че да е достатъчно интелигентен, за да не хвърля първичен ключ?
Добре, разбрах го, отчасти благодарение на коментара на Rp-