Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hibernate中将字符串映射为主键_Java_Hibernate_Vaadin_Vaadin7 - Fatal编程技术网

Java 在Hibernate中将字符串映射为主键

Java 在Hibernate中将字符串映射为主键,java,hibernate,vaadin,vaadin7,Java,Hibernate,Vaadin,Vaadin7,我正在开发一个项目,在这个项目中我有一个名为“指挥”(西班牙语,Driver)的课程。此导体类具有参数LatLng(包含位置纬度经度)。我希望这两个类使用Hibernate将它们持久化到我的数据库中,我对Hibernate有一些经验 下面是带有Hibrate映射文件的类: public class LatLng implements Serializable { /* * Atributos */ private static final long serialVersionUID =

我正在开发一个项目,在这个项目中我有一个名为“指挥”(西班牙语,Driver)的课程。此导体类具有参数LatLng(包含位置纬度经度)。我希望这两个类使用Hibernate将它们持久化到我的数据库中,我对Hibernate有一些经验

下面是带有Hibrate映射文件的类:

public class LatLng implements Serializable {


/*
 * Atributos
 */
private static final long serialVersionUID = -234127535402360915L;

private long id;
private double latitud;
private double longitud;

/*
 * Métodos
 */
public LatLng(){

}

public LatLng(double latitud, double longitud){
    this.latitud = latitud;
    this.longitud = longitud;
}

public long getId() {
    return id;
}

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

public double getLatitud() {
    return this.latitud;
}

public void setLatitud(double value) {
    this.latitud = value;
}

public double getLongitud() {
    return this.longitud;
}

public void setLongitud(double value) {
    this.longitud = value;
}

@Override
public String toString() {
    return "Latitud: " + this.latitud + ", longitud: " + this.longitud;
}

@Override
public int hashCode() {
    int result;
    result = (int) (id + latitud + longitud);
    return result;
}

@Override
public boolean equals(Object other) {
    if(other==null)
        return false;

    if( !(other instanceof Conductor) )
        return false;

    LatLng pos = (LatLng) other;

    return pos.getId()==this.id && pos.getLatitud()==this.latitud && pos.getLongitud()==this.longitud;

}
}

}

。。。使用此线路导体c=new PtDaoService().anadir导体(电子邮件、姓名、tfno、住所、lat、lon);抛出以下消息时捕获异常:

feb 17, 2015 1:05:40 PM com.vaadin.server.DefaultErrorHandler doDefault
GRAVE:org.hibernate.id.IdentifierGenerationException:调用save()之前,必须手动分配此类的id:com.ingartek.cavwebapp.model.Conductor 在org.hibernate.id.Assigned.generate(Assigned.java:52)

哪一个是我的错误

需要帮助:(


谢谢

解决了。我在Dao中使用的构造函数没有分配任何内容

应该是这样的:

public Conductor(String email, String nombre, String telefono, String domicilio,
        LatLng domicilioCoord){
    this.email = email;
    this.nombre = nombre;
    this.telefono = telefono;
    this.domicilio = domicilio;
    this.domicilioCoord = domicilioCoord;
}

Assigned意味着hibernate将理解,当保存任何对象时,hibernate不负责为当前插入的对象创建任何主键值,用户必须接受响应。这是hibernate使用的默认生成器类,如果我们不在id元素下指定元素,则hibernate默认假定它为“已分配”如果已分配generator类,则您负责将主键值分配给要保存到数据库中的对象。由于您在hbm文件中编写了主键值,并且您没有手动为主键分配值,因此您得到了该异常。
public class Conductor implements Serializable {

/*
 * Atributos
 */
private static final long serialVersionUID = 4492787316635472774L;

private String email;
private String nombre;
private String telefono;
private String domicilio;
private LatLng domicilioCoord;

/*
 * Métodos
 */
public Conductor(){

}

public Conductor(String email, String nombre, String telefono, String domicilio,
        LatLng domicilioCoord){

}

public String getNombre() {
    return this.nombre;
}

public void setNombre(String value) {
    this.nombre = value;
}

public String getEmail() {
    return this.email;
}

public void setEmail(String value) {
    this.email = value;
}

public String getTelefono() {
    return this.telefono;
}

public void setTelefono(String value) {
    this.telefono = value;
}

public String getDomicilio() {
    return this.domicilio;
}

public void setDomicilio(String value) {
    this.domicilio = value;
}

public LatLng getDomicilioCoord() {
    return this.domicilioCoord;
}

public void setDomicilioCoord(LatLng value) {
    this.domicilioCoord = value;
}

@Override
public int hashCode() {
    return email.hashCode() + nombre.hashCode() + telefono.hashCode() + domicilio.hashCode() + domicilioCoord.hashCode();
}

@Override
public boolean equals(Object other) {
    if(other==null)
        return false;

    if( !(other instanceof Conductor) )
        return false;

    Conductor c = (Conductor) other;

    return c.getEmail().equals(this.email) 
            && c.getNombre().equals(this.nombre)
            && c.getTelefono().equals(this.telefono)
            && c.getDomicilio().equals(this.domicilio)
            && c.getDomicilioCoord().equals(this.domicilioCoord);
}
<!DOCTYPE hibernate-mapping PUBLIC 
"Hibernate Mapping 3.0" 
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<class name="com.ingartek.cavwebapp.model.Conductor" table="CONDUCTORES">

    <!-- Las clases referenciadas no se habían creado -->

    <id name="email" type="text" column="CONDUCTORES_EMAIL">
        <generator class="assigned" />
    </id>

    <property name="nombre" type="string" column="CONDUCTORES_NOMBRE" not-null="true" />
    <property name="telefono" type="string" column="CONDUCTORES_TELEFONO" not-null="true" />
    <property name="domicilio" type="string" column="CONDUCTORES_DOMICILIO" not-null="true" />

    <!-- Clases referenciadas -->
    <many-to-one name="domicilioCoord" column="CONDUCTORES_DOCIMILIOCOORD" class="com.ingartek.cavwebapp.model.LatLng" cascade="remove" />

</class>
    if(!isEmailUsado(pEmail)){
        beginTransaction();
        System.out.println("Creando el conductor");
        LatLng pos = new LatLng(pLat, pLon);
        System.out.println("El identificador de la posicion es " + pos.getId());
        Conductor unConductor = new Conductor(pEmail, pNombre, pTfno, pDomicilio, pos);

        if(!flota.existeConductor(unConductor)){
            flota.anadirConductor(unConductor);
        }

        session.save(pos);
        session.save(unConductor);
        commitTransaction();
        return unConductor;     
    }else{
        rollbackTransaction();
        throw new ExisteConductorException();
    }
}
feb 17, 2015 1:05:40 PM com.vaadin.server.DefaultErrorHandler doDefault
public Conductor(String email, String nombre, String telefono, String domicilio,
        LatLng domicilioCoord){
    this.email = email;
    this.nombre = nombre;
    this.telefono = telefono;
    this.domicilio = domicilio;
    this.domicilioCoord = domicilioCoord;
}