在jpa中获取自动生成的列Id = null

时间:2016-06-29 06:28:43

标签: java mysql hibernate jpa

当我尝试在表中插入数据时获取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 + " ]";
    }
}

将数据存储在表格i中,使用代码

 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)

请告诉我,如果我做错了请帮助......谢谢

3 个答案:

答案 0 :(得分:0)

标识排序使用数据库中的特殊IDENTITY列,以允许数据库在插入行时自动为对象分配id。许多数据库都支持标识列,例如MySQL,DB2,SQL Server,Sybase和Postgres。 Oracle不支持IDENTITY 列,但可以使用序列对象和触发器对其进行模拟。

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

您可以更改此代码

@GeneratedValue(strategy = GenerationType.IDENTITY)

到此

@GeneratedValue(strategy = GenerationType.SEQUENCE)

答案 1 :(得分:0)

PhysicianJpaController()可能找不到医生“physicianId”,所以你可能会尝试这样做: 的 builder.setPhysician(空); 你有这个: physician int(11)NOT NULL

答案 2 :(得分:0)

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