org.hibernate.id.IdentifierGenerationException:为:class生成的null id

时间:2018-05-30 07:59:18

标签: hibernate

我在插入具有两个依赖项的表

时遇到以下异常

查看我的实体类,这些是自动生成的

AssocTransportVehicleDriver

package com.rasvek.cg.entity;
// Generated May 14, 2018 11:39:07 PM by Hibernate Tools 5.1.7.Final

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * AssocTransportVehicleDriver generated by hbm2java
 */
@Entity
@Table(name = "assoc_transport_vehicle_driver", catalog = "campus_guru_01")
public class AssocTransportVehicleDriver implements java.io.Serializable {

    private AssocTransportVehicleDriverId id;
    private TransportDriverInfo transportDriverInfo;
    private TransportVehicleInfo transportVehicleInfo;

    public AssocTransportVehicleDriver() {
    }

    public AssocTransportVehicleDriver(AssocTransportVehicleDriverId id, TransportDriverInfo transportDriverInfo,
            TransportVehicleInfo transportVehicleInfo) {
        this.id = id;
        this.transportDriverInfo = transportDriverInfo;
        this.transportVehicleInfo = transportVehicleInfo;
    }

    @EmbeddedId

    @AttributeOverrides({
            @AttributeOverride(name = "vehicleId", column = @Column(name = "vehicle_id", nullable = false)),
            @AttributeOverride(name = "tdiId", column = @Column(name = "tdi_id", nullable = false)) })
    public AssocTransportVehicleDriverId getId() {
        return this.id;
    }

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

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "tdi_id", nullable = false, insertable = false, updatable = false)
    public TransportDriverInfo getTransportDriverInfo() {
        return this.transportDriverInfo;
    }

    public void setTransportDriverInfo(TransportDriverInfo transportDriverInfo) {
        this.transportDriverInfo = transportDriverInfo;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "vehicle_id", nullable = false, insertable = false, updatable = false)
    public TransportVehicleInfo getTransportVehicleInfo() {
        return this.transportVehicleInfo;
    }

    public void setTransportVehicleInfo(TransportVehicleInfo transportVehicleInfo) {
        this.transportVehicleInfo = transportVehicleInfo;  
    }

}

与此类一起生成的另一个(@Embeddable)类,名为

AssocTransportVehicleDriverId //它有什么用途

@Embeddable
public class AssocTransportVehicleDriverId implements java.io.Serializable {

    private int vehicleId;
    private int tdiId;

    public AssocTransportVehicleDriverId() {
    }

    public AssocTransportVehicleDriverId(int vehicleId, int tdiId) {
        this.vehicleId = vehicleId;
        this.tdiId = tdiId;
    }

    @Column(name = "vehicle_id", nullable = false)
    public int getVehicleId() {
        return this.vehicleId;
    }

    public void setVehicleId(int vehicleId) {
        this.vehicleId = vehicleId;
    }

    @Column(name = "tdi_id", nullable = false)
    public int getTdiId() {
        return this.tdiId;
    }

    public void setTdiId(int tdiId) {
        this.tdiId = tdiId;
    }

    public boolean equals(Object other) {
        if ((this == other))
            return true;
        if ((other == null))
            return false;
        if (!(other instanceof AssocTransportVehicleDriverId))
            return false;
        AssocTransportVehicleDriverId castOther = (AssocTransportVehicleDriverId) other;

        return (this.getVehicleId() == castOther.getVehicleId()) && (this.getTdiId() == castOther.getTdiId());
    }

    public int hashCode() {
        int result = 17;

        result = 37 * result + this.getVehicleId();
        result = 37 * result + this.getTdiId();
        return result;
    }

}

当我尝试插入AssocTransportVehicleDriver时,上述异常正在发生。不知道为什么?

AssocTransportVehicleDriver表在表格中没有任何Id列,但它已生成

请查看我的查询

                  AssocTransportVehicleDriver obj=null;




                    if(transportVehicleInfoId != 0 && transportDriverInfoId != 0)
                    {
                        TransportVehicleInfo    transportVehicleInfo1 = new TransportVehicleInfo();

                        TransportDriverInfo transportDriverInfo1 = new TransportDriverInfo();

                        transportDriverInfo1.setTdiId(transportDriverInfoId);
                        transportVehicleInfo1.setVehicleId(transportDriverInfoId);


                        obj= new AssocTransportVehicleDriver();

                        obj.setTransportDriverInfo(transportDriverInfo1);
                        obj.setTransportVehicleInfo(transportVehicleInfo1);
                        res=service.addAssocDriverVehicle(obj);
                    }  



@Override
    public boolean addAssocDriverVehicle(AssocTransportVehicleDriver  assocTransportVehicleDriver) {
         boolean success = false;
         try {

                currentSession=sessionFactory.getCurrentSession();
                currentSession.save(assocTransportVehicleDriver);     
                success=true;  
         }       
         catch (Exception e) {
            e.printStackTrace();  
        }

        return success; 
    }     

请让我知道它为什么会发生。如何插入AssocTransportVehicleDriver

我是一个非常新的冬眠,请原谅我,如果它是愚蠢的。

谢谢你!

1 个答案:

答案 0 :(得分:0)

EmbeddedId告诉hibernate在这种情况下该表有​​一个复合pk vehicleId/tdiId

您必须为AssocTransportVehicleDriver的每个实例设置它  很像其他领域

obj= new AssocTransportVehicleDriver();
obj.setTransportDriverInfo(transportDriverInfo1);
obj.setTransportVehicleInfo(transportVehicleInfo1);

hibernate如何在没有Id的情况下生成insert语句?

它应该是这样的:

obj.setId(new AssocTransportVehicleDriverId(vehicleId,tdiId));