Hibernate не ми позволява да добавя обект с Derby Database, който има автоматично генериран Identity PK

Имам таблица на база данни 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-


person bulltorious    schedule 19.09.2014    source източник
comment
@Rp-това помогна! Сега получавам тази грешка: org.hibernate.id.IdentifierGenerationException: идентификаторите за този клас трябва да бъдат ръчно присвоени преди извикване на save(): com.yaya.yyy.Servicelog в org.hibernate.id.Assigned.generate(Assigned.java :52)   -  person RP-    schedule 19.09.2014
comment
Някой знае ли връзката между кодовата анотация @GeneratedValue и атрибута ‹generator class=› в XML?   -  person bulltorious    schedule 19.09.2014


Отговори (2)


трябваше да се промени на

private int id;

И в Servicelog.hbm.xml

private Integer id; 

Опитайте тази-

    <id name="id" type="int">
        <column name="ID" />
        <generator class="identity" />
    </id>

to

    <id name="id" type="java.lang.Integer">
        <column name="ID" />
        <generator class="assigned" />
    </id>
person bulltorious    schedule 19.09.2014
comment
И двете са еквиваленти. Използваме който и да е от тях въз основа на това дали използваме анотации или hbms за съпоставянето на ИЛИ. _1_ е равно на _2_. Като цяло _3_ зависи от основната база данни. Няма да поддържа всички бази данни. Съмнявам се, че _4_ не може да поддържа _5_, но все пак не съм сигурен. Ако дефинирате _6_, трябва да присвоите ключа, преди да запазите. - person bulltorious; 19.09.2014
comment
Как да определя дали да използвам анотации или hbms xml файла? Бих предпочел да използвам анотации. - person RP-; 20.09.2014
comment
Тогава трябва да се придържате само към анотации, лоша идея е да комбинирате и hbms, и анотации. Трябва да използвате _1_, докато конфигурирате своя _2_. Ще намерите по-добра помощ и уроци онлайн. - person bulltorious; 20.09.2014
comment
Добавянето на коментари / обяснения към вашия код ще направи отговора ви още по-добър. - person RP-; 20.09.2014

дефинирайте

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
като _2_ или _3_.

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
person Moni    schedule 19.09.2014
comment
@Moni - Не, пробвах всички GenerationType, не изглежда да има никакво влияние. - person David Brossard; 19.09.2014
comment
Предупреждение: StandardWrapperValve[DbTest]: Servlet.service() за сървлет DbTest хвърли изключение org.hibernate.exception.SQLGrammarException: не можа да подготви израз в org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) в org .hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) в org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) в org.hibernate.engine.jdbc.internal.StatementPreparerImpl $StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:196) в org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:96) в org.hibernate.engine.jdbc.batch.internal.AbstractBatchImplSta.buildBatch tement(AbstractBatchImpl .java:152) в org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:141) в org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3102) в org. Hibernate.persister.Entity.ABTRACTENTITYSERSISTER.INSERT (AbstractItityPister.java:3587) на org.hibernate.action.internal.entityinsertaction.execute (entityinsertaction.java:103) в org.hibernate.engine.spi.actioneue.executeactions (действие. java:453) в org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:345) в org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) в org.hibernate.event.internal .DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) в org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1218) в org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:421) в org.hibernate. engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) в org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) в com.ya.ya.zzzyaya.DbTest. processRequest(DbTest.java:97) в com.ya.ya.zzzyaya.DbTest.doGet(DbTest.java:116) в javax.servlet.http.HttpServlet.service(HttpServlet.java:687) в javax.servlet.http .HttpServlet.service(HttpServlet.java:790) в org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) в org.apache.catalina.core. StandardContextValve.invoke(StandardContextValve.java:160) в org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) в org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) в com .sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) в org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter .java:357) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) в com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) в org. glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) в org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) в org.glassfish.grizzly.http.server. HttpServerFilter.handleRead(HttpServerFilter.java:189) в org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) в org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) при org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) в org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) в org.glassfish.grizzly.filterchain.DefaultFilterChain.process( DefaultFilterChain.java:114) в org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) в org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) в org.glassfish.grizzly .strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) в org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) в org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(Worker ThreadIOStrategy.java: 55) в org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) в org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) в org.glassfish. гризли .threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) в java.lang.Thread.run(Thread.java:745) - person bulltorious; 19.09.2014