加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – “列’id’不允许NULL”,即使log说它有值绑定

发布时间:2020-12-15 04:18:44 所属栏目:Java 来源:网络整理
导读:所以,我一直在抨击这个好几个小时! 我一直在测试这个有很多不同的设置.. 最重要的是,当我在JBoss中启动我的EAR时,我能够与Persistence-Jar和所有它的@Entities进行交互而没有任何问题.不同之处在于,在JBoss中运行它时,使用了不同的persistence.xml(maven ma
所以,我一直在抨击这个好几个小时!

我一直在测试这个有很多不同的设置..

最重要的是,当我在JBoss中启动我的EAR时,我能够与Persistence-Jar和所有它的@Entities进行交互而没有任何问题.不同之处在于,在JBoss中运行它时,使用了不同的persistence.xml(maven main / test目录结构),它通过JTA连接连接到PostgreSQL服务器.

只有当我在maven和JUnit中运行我的测试时,它们才会失败.

我一直在尝试在PostgreSQL模式下使用H2数据库(但是我将它作为数据库连接服务器运行而没有成功)

它似乎在处理我的Systemuser-entity id-value

这是我的Systemuser类的顶部:

@Entity
@Table(name = "systemuser")
public class SystemUser extends BaSEOldStyleEntity implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@SequenceGenerator(name = "SYSTEMUSER_SYSTEMUSERIDNR_GENERATOR",sequenceName = "systemuser_pk_seq",allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "SYSTEMUSER_SYSTEMUSERIDNR_GENERATOR")
@Column(name = "systemuseridnr",unique = true,nullable = false)
@BusinessKey
private Integer id;
...

这是几乎所有表都继承自的BaSEOldStyleEntity

@MappedSuperclass
@AdditionalCriteria("this.statusNr < 31000")
@Customizer(value = EntityCustomizer.class)
public abstract class BaSEOldStyleEntity extends BaseEntity implements Serializable {

@Column(name = "editby",length = 10,nullable = false)
protected String editBy;

@Column(name = "lastedittime",columnDefinition = "timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP::timestamp(6)")
@Temporal(TemporalType.TIMESTAMP)
protected Date lastEditTime = new Date();

@Column(name = "statusnr",nullable = false,columnDefinition = "integer default '0'")
protected Integer statusNr = 0;

public static final String EDIT_BY = "editBy";
public static final String LAST_EDIT_TIME = "lastEditTime";
public static final String STATUS_NR = "statusNr";

public String getEditBy() {
    return editBy;
}

public void setEditBy(String editBy) {
    this.editBy = editBy;
    this.lastEditTime = new Date();
}

public Date getLastEditTime() {
    return lastEditTime;
}

public void setLastEditTime(Date lastEditTime) {
    this.lastEditTime = lastEditTime;
}

public Integer getStatusNr() {
    return statusNr;
}

public void setStatusNr(Integer statusNr) {
    this.statusNr = statusNr;
}
}

而BaSEOldStyleEntity又继承自BaseEntity

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
    @Override
    public boolean equals(Object obj) {
        return BusinessIdentity.areEqual(this,obj);

    }
    @Override
    public int hashCode() {
        return BusinessIdentity.getHashCode(this);
    }

    @Override
    public String toString() {
        //return BusinessIdentity.toString(this);
        return "toString() not set on entity " + getClass().getName();
    }
}

这就是我的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="foo-test" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<!-- ALL MY CLASSES -->

        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:target/test-db/foo-test;MODE=PostgreSQL" />
            <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform" />
            <!-- EclipseLink should create the database schema automatically -->
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
            <!-- Configure logging -->
            <property name="eclipselink.logging.level" value="ALL" />
        </properties>
    </persistence-unit>
</persistence>

这是我收到的日志输出:
(前6行是表“systemuserrole”和“systemusergroup”的实体插入)

[EL Finest]: query: 2014-03-17 18:28:42.761--UnitOfWork(134154804)--Thread(Thread[main,5,main])--Execute query InsertObjectQuery(toString() not set on entity se.point.unity.domain.SystemUserRole)
[EL Fine]: sql: 2014-03-17 18:28:42.761--ClientSession(350731153)--Connection(2020456228)--Thread(Thread[main,main])--INSERT INTO systemuserrole (systemuserroleidnr,editby,lastedittime,systemuserrolename,statusnr) VALUES (?,?,?)
    bind => [-1,test,2014-03-17 18:28:42.511,0]
[EL Finest]: query: 2014-03-17 18:28:42.762--UnitOfWork(134154804)--Thread(Thread[main,main])--Execute query InsertObjectQuery(test (-1))
[EL Fine]: sql: 2014-03-17 18:28:42.762--ClientSession(350731153)--Connection(2020456228)--Thread(Thread[main,main])--INSERT INTO systemusergroup (systemusergroupidnr,systemusergroupname,statusnr,systemuserroleidnr) VALUES (?,2014-03-17 18:28:42.512,-1]
[EL Finest]: query: 2014-03-17 18:28:42.763--UnitOfWork(134154804)--Thread(Thread[main,main])--Execute query InsertObjectQuery(name (-1))
[EL Fine]: sql: 2014-03-17 18:28:42.763--ClientSession(350731153)--Connection(2020456228)--Thread(Thread[main,main])--INSERT INTO systemuser (systemuseridnr,failedloginattempts,firstname,lastfailedlogindate,lastlogindate,lastname,systemusername,password,phone,systemusergroupidnr) VALUES (?,name,-1]
[EL Fine]: sql: 2014-03-17 18:28:42.763--ClientSession(350731153)--Thread(Thread[main,main])--SELECT 1
[EL Warning]: 2014-03-17 18:28:42.764--UnitOfWork(134154804)--Thread(Thread[main,main])--Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement:
INSERT INTO systemuser (systemuseridnr,?) [23502-168]
Error Code: 23502
Call: INSERT INTO systemuser (systemuseridnr,-1]
Query: InsertObjectQuery(name (-1))
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:851)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:913)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:594)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:537)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1800)
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:286)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:342)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:162)
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:177)
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:471)
    at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
    at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
    at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:286)
    at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:852)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:751)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1535)
    at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:224)
    at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:191)
    at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:136)
    at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:3914)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1419)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:634)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithPreBuiltChangeSet(UnitOfWorkImpl.java:1565)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:445)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:798)
    at se.point.unity.service.search.SearchStructureTest.setUp(SearchStructureTest.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement:
INSERT INTO systemuser (systemuseridnr,?) [23502-168]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
    at org.h2.message.DbException.get(DbException.java:169)
    at org.h2.message.DbException.get(DbException.java:146)
    at org.h2.table.Column.validateConvertUpdateSequence(Column.java:293)
    at org.h2.table.Table.validateConvertUpdateSequence(Table.java:689)
    at org.h2.command.dml.Insert.insertRows(Insert.java:120)
    at org.h2.command.dml.Insert.update(Insert.java:84)
    at org.h2.command.CommandContainer.update(CommandContainer.java:75)
    at org.h2.command.Command.executeUpdate(Command.java:230)
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:842)
    ... 59 more

[EL Finer]: transaction: 2014-03-17 18:28:42.765--UnitOfWork(134154804)--Thread(Thread[main,main])--release unit of work
[EL Finer]: transaction: 2014-03-17 18:28:42.765--ClientSession(350731153)--Connection(2020456228)--Thread(Thread[main,main])--rollback transaction
[EL Finest]: connection: 2014-03-17 18:28:42.77--ServerSession(1278414937)--Connection(2020456228)--Thread(Thread[main,main])--Connection released to connection pool [default].
[EL Finer]: connection: 2014-03-17 18:28:42.771--ClientSession(350731153)--Thread(Thread[main,main])--client released
[EL Finest]: jpa: 2014-03-17 18:28:42.775--ServerSession(1278414937)--Thread(Thread[main,main])--Begin undeploying Persistence Unit foo-test; session file:/C:/Users/jedmin/Desktop/unity/branches/DEVELOPMENT/Persistence-Unit/target/test-classes/_foo-test; state Deployed; factoryCount 1
[EL Finest]: sequencing: 2014-03-17 18:28:42.775--ServerSession(1278414937)--Thread(Thread[main,main])--sequencing disconnected
[EL Config]: connection: 2014-03-17 18:28:42.775--ServerSession(1278414937)--Connection(2020456228)--Thread(Thread[main,main])--disconnect
[EL Finer]: cache: 2014-03-17 18:28:42.93--ServerSession(1278414937)--Thread(Thread[main,main])--initialize identitymaps
[EL Info]: connection: 2014-03-17 18:28:42.93--ServerSession(1278414937)--Thread(Thread[main,main])--file:/C:/Users/jedmin/Desktop/unity/branches/DEVELOPMENT/Persistence-Unit/target/test-classes/_foo-test logout successful
[EL Config]: connection: 2014-03-17 18:28:42.93--ServerSession(1278414937)--Connection(1864311781)--Thread(Thread[main,main])--disconnect
[EL Finest]: jpa: 2014-03-17 18:28:42.931--ServerSession(1278414937)--Thread(Thread[main,main])--End undeploying Persistence Unit foo-test; session file:/C:/Users/jedmin/Desktop/unity/branches/DEVELOPMENT/Persistence-Unit/target/test-classes/_foo-test; state Undeployed; factoryCount 0

从我可以从日志中收集 – 没有任何值为null ..
也,

这里发生了什么?

UPDATE1:

所以我测试了一些建议并与我的同事讨论了一下,然后我们注意到生成的表有一个我们没想到的列; ‘ID’!这是具有’systemuseridnr’的复合pk的一部分!

这里奇怪的是我尝试重命名变量’id’以匹配@Column注释的名称值,并且在我下载创建数据库之后问题仍然存在,并让EclipseLink重建表.

我也试过寻找其他可能在@OneToMany中使用mappedBy值中的静态字符串的实体,如下所示,但我没有找到!

@OneToMany(mappedBy = "id")
private List<SystemUser> users;

UPDATE2:

这是由Eclipselink自动生成的表的定义(如果我使用它,则为Hibernate)

注意名为’id’的列!它是如何成为主键的一部分!

CREATE TABLE systemuser
(
      systemuseridnr integer NOT NULL,editby character varying(10) NOT NULL,failedloginattempts smallint,firstname character varying(40),lastedittime timestamp(0) without time zone NOT NULL DEFAULT (now())::timestamp(6) without time zone,lastfailedlogindate timestamp without time zone,lastlogindate timestamp without time zone,lastname character varying(40),systemusername character varying(10) NOT NULL,password character varying(100) NOT NULL,phone character varying(20),statusnr integer DEFAULT 0,systemusergroupidnr integer NOT NULL,id integer NOT NULL,vismavalue integer,terminalvendor_id integer,CONSTRAINT systemuser_pkey PRIMARY KEY (systemuseridnr,id ),CONSTRAINT fk_systemuser_terminalvendor_id FOREIGN KEY (terminalvendor_id)
          REFERENCES terminalvendor (terminalvendoridnr) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION,CONSTRAINT systemuser_systemusername_key UNIQUE (systemusername )
);

解决方法

它出现了另一种可能的解决方案,用于创建正确的CREATE TABLE语句.

http://mrbool.com/how-to-create-database-table-using-hibernate/28269

最棒的是:

<property name="hbmdl.auto">update</property>

使用此解决方案,您的代码将自己生成一个语句.试试吧!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读