【问题标题】:getting auto generated column Id =null in jpa在 jpa 中获取自动生成的列 ID =null
【发布时间】:2016-06-29 06:28:42
【问题描述】:

当我尝试在表中插入数据时获取 id = null 是我的创建表语法

CREATE TABLE query_builder (
  id int(11) NOT NULL AUTO_INCREMENT,
  query_title varchar(150) NOT NULL,
  sql_query text NOT NULL,
  condition varchar(50) NOT NULL,
  output_fields varchar(45) NOT NULL,
  physician int(11) NOT NULL,
  creation_time timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  modification_time timestamp NULL DEFAULT NULL,
  discription text NOT NULL,
  PRIMARY KEY (id),
  KEY query_builder_physician_FK_idx (physician),
  CONSTRAINT query_builder_physician_FK FOREIGN KEY (physician) REFERENCES physician (Physician_Id) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这个实体是

import java.io.Serializable;

import javax.xml.bind.annotation.XmlTransient;

public class QueryBuilder implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, unique = true)
    private Integer id;
    @Basic(optional = false)
    @Column(name = "query_title")
    private String queryTitle;
    @Basic(optional = false)
    @Lob
    @Column(name = "sql_query")
    private String sqlQuery;
    @Basic(optional = false)
    @Column(name = "condition")
    private String condition;
    @Basic(optional = false)
    @Column(name = "output_fields")
    private String outputFields;
    @Column(name = "creation_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationTime;
    @Column(name = "modification_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date modificationTime;
    @Basic(optional = false)
    @Lob
    @Column(name = "discription")
    private String discription;
    @JoinColumn(name = "physician", referencedColumnName = "Physician_Id")
    @ManyToOne(optional = false)
    private Physician physician;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name= "querybuilderId")
    private Collection<QueryBuilderCondition> queryBuilderConditionCollection;

    public QueryBuilder() {
    }

    public QueryBuilder(Integer id) {
        this.id = id;
    }

    public QueryBuilder(Integer id, String queryTitle, String sqlQuery, String condition, String outputFields, String discription) {
        this.id = id;
        this.queryTitle = queryTitle;
        this.sqlQuery = sqlQuery;
        this.condition = condition;
        this.outputFields = outputFields;
        this.discription = discription;
    }

    public Integer getId() {
        return id;
    }

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

    public String getQueryTitle() {
        return queryTitle;
    }

    public void setQueryTitle(String queryTitle) {
        this.queryTitle = queryTitle;
    }

    public String getSqlQuery() {
        return sqlQuery;
    }

    public void setSqlQuery(String sqlQuery) {
        this.sqlQuery = sqlQuery;
    }

    public String getCondition() {
        return condition;
    }

    public void setCondition(String condition) {
        this.condition = condition;
    }

    public String getOutputFields() {
        return outputFields;
    }

    public void setOutputFields(String outputFields) {
        this.outputFields = outputFields;
    }

    public Date getCreationTime() {
        return creationTime;
    }

    public void setCreationTime(Date creationTime) {
        this.creationTime = creationTime;
    }

    public Date getModificationTime() {
        return modificationTime;
    }

    public void setModificationTime(Date modificationTime) {
        this.modificationTime = modificationTime;
    }

    public String getDiscription() {
        return discription;
    }

    public void setDiscription(String discription) {
        this.discription = discription;
    }

    public Physician getPhysician() {
        return physician;
    }

    public void setPhysician(Physician physician) {
        this.physician = physician;
    }

    @XmlTransient
    public Collection<QueryBuilderCondition> getQueryBuilderConditionCollection() {
        return queryBuilderConditionCollection;
    }

    public void setQueryBuilderConditionCollection(Collection<QueryBuilderCondition> queryBuilderConditionCollection) {
        this.queryBuilderConditionCollection = queryBuilderConditionCollection;
    }

    @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 QueryBuilder)) {
            return false;
        }
        QueryBuilder other = (QueryBuilder) 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 "com.medikm.entity.QueryBuilder[ id=" + id + " ]";
    }
}

将数据存储在我使用下面代码的表中

 builder.setCondition(condition);
 builder.setCreationTime(new Date());
 builder.setDiscription(discription);
 builder.setOutputFields(fields);
 builder.setPhysician(new  PhysicianJpaController().findPhysician(physicianId));
 builder.setQueryTitle(title);
 builder.setSqlQuery(query);
 em.persist(builder);
 em.getTransaction().commit();
 em.close();

但上面的代码给我一个错误

this is the error that i got when i try to persist
 [EL Warning]: 2016-06-29 14:22:03.749--UnitOfWork(900737)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseExceptionInternal Exception: om.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'condition, output_fields, discription, creation_time, modification_time, physici' at line 1Error Code: 1064
Call: INSERT INTO query_builder (query_title, sql_query, condition,output_fields, discription, creation_time, modification_time, physician) VALUES (?, ?, ?, ?, ?, ?, ?, ?)      bind => [adfdfafad, SELECT c.Case_Id, c.Age FROM case1 c, patient p, episode e, personal_medical_history pmh, reproductive_history rh WHERE( c.Disease_type = 2 AND c.Primary_Diagnosis_Dt <> '2016/06/22' OR c.Clinical_Stage = 'I'
 ) AND c.Patient_Id = p.Patient_Id AND e.Case_Id = c.Case_Id
 AND pmh.Patient_Id = p.Patient_Id AND rh.Patient_Id = p.Patient_Id
 GROUP BY c.Case_Id , "OR", ["ca.Age","ca.aortic_node_positive"], adffda, 2016-06-29 14:22:03.724, null, 200]Query: InsertObjectQuery(com.medikm.entity.QueryBuilder[ id=null ])javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'condition, output_fields, discription, creation_time, modification_time, physici' at line 1
Error Code: 1064Call: INSERT INTO query_builder (query_title, sql_query, condition, output_fields, discription, creation_time, modification_time, physician) VALUES (?, ?, ?, ?, ?, ?, ?, ?) bind => [adfdfafad, SELECT c.Case_Id, c.Age FROM case1 c, patient p, episode e, personal_medical_history pmh, reproductive_history rhWHERE( c.Disease_type = 2 AND c.Primary_Diagnosis_Dt <> '2016/06/22' OR c.Clinical_Stage = 'I' ) AND c.Patient_Id = p.Patient_Id
 AND e.Case_Id = c.Case_Id AND pmh.Patient_Id = p.Patient_Id
 AND rh.Patient_Id = p.Patient_Id GROUP BY c.Case_Id , "OR", ["ca.Age","ca.aortic_node_positive"], adffda, 2016-06-29 14:22:03.724, null, 200]Query: InsertObjectQuery(com.medikm.entity.QueryBuilder[ id=null ])at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)

如果我做错了什么请告诉我...谢谢您

【问题讨论】:

  • 查看为 INSERT 调用的 SQL(在 JPA 提供程序日志中)。
  • 我在查询中也有问题我想保存这个query_builder (query_title, sql_query, condition, output_fields,physician,creation_time, modification_time, discription) 但查询保存query_builder (query_title, sql_query, condition, output_fields, discription, creation_time, modification_time, physician) 为什么查询保存这个我不知道请帮忙
  • 感谢尼尔的回复,我已经发布了我得到的整个错误
  • SQL 语句被“sql_query”搞砸了。无论“SELECT c.Case_Id, c.Age FROM case1 ...”来自哪里。您很可能没有向我们展示足够的信息...

标签: java mysql hibernate jpa


【解决方案1】:

身份排序使用数据库中的特殊 IDENTITY 列来允许数据库在插入行时自动为对象分配一个 ID。许多数据库都支持标识列,例如 MySQL、DB2、SQL Server、Sybase 和 Postgres。 Oracle 不支持 IDENTITY 列,但可以通过使用序列对象和触发器来模拟它们。

如果您使用的是 Oracle,这可能就是原因。

您可以更改此代码

@GeneratedValue(strategy = GenerationType.IDENTITY)

到这里

@GeneratedValue(strategy = GenerationType.SEQUENCE)

【讨论】:

  • 谢谢你的回答,但我仍然有同样的问题,我使用 MYSQL 数据库......通过使用@GeneratedValue id 没有变空,但这次它给出了 sql 语法错误..
【解决方案2】:

PhysicianJpaController() 可能找不到具有“physicianId”的医生,因此您可能正在尝试这样做: builder.setPhysician(null); 虽然你也有这个: 医师 int(11) NOT NULL

【讨论】:

  • 谢谢你的回答我也试过了,但仍然有同样的错误Query: InsertObjectQuery(com.medikm.entity.QueryBuilder[ id=null ]) Exception is :- 42000
【解决方案3】:

大家好,非常感谢你们的帮助问题,我发现在我的实体中,因为我检查我发现条件是 mysql 中的保留关键字,因此我收到了这个错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2015-09-20
    相关资源
    最近更新 更多