Java 在Hibernate中将字符串映射为主键
我正在开发一个项目,在这个项目中我有一个名为“指挥”(西班牙语,Driver)的课程。此导体类具有参数LatLng(包含位置纬度经度)。我希望这两个类使用Hibernate将它们持久化到我的数据库中,我对Hibernate有一些经验 下面是带有Hibrate映射文件的类: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 =
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;
}