所以,经过多次尝试尝试按照我想要的方式完成这项工作,当然还要检查不同的指南,我现在来找你们。
我的程序设计如下:
角色(父亲对象) -persona_cuil(DB上的pk,由用户生成)
empleado(角色的儿子) -legajo_id(pk在DB上,由程序NOT DB生成(无法使其工作)) -persona_cuil(来自角色的FK)
empvarios(empleado' s) -legajo_id(来自empleado的PK和FK)
现在,数据库以这种方式映射,并且它工作得很好,问题似乎是hibernate某处混合了发送到每个对象的主键,而不是在empvarios中插入legajo_id,它会插入一个persona_cuil。 / p>
clases代码:
角色:
@Entity
@Table(name = "persona")
@Inheritance(strategy = InheritanceType.JOINED)
public class persona implements Serializable {
private static final long serialVersionUID = 2847733720742959767L;
@Id
@Column(name="persona_cuil")
private String persona_cuil;
@Column(name="nombre")
private String nombre;
@Column(name="apellido")
private String apellido;
@Column(name="fecha_nac")
private String fecha_nac;
@Column(name="direccion")
private String direccion;
@Column(name="localidad")
private String localidad;
@Column(name="provincia")
private String provincia;
@Column(name="pais")
private String pais;
@Column(name="fecha_muerte")
private String fecha_muerte;
@Column(name="fecha_alta")
private String fecha_alta;
@Column(name="fecha_baja")
private String fecha_baja;
@Column(name="mail")
private String mail;
@Column(name="plan_id")
private int plan_id;
public persona (){
this.setPlan_id(0);
}
//Getters and Setters
}
empleado:
@Entity
@Table(name = "empleado")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name="persona_cuil")
public class empleado extends persona implements Serializable {
private static final long serialVersionUID = -7792000781951823557L;
@Column(name="legajo_id")
private int legajo_id;
public empleado(){
super();
int leg = SentenceManager.ultimoRegistro("empleado");
if (leg == 0){ //this works fine, it just searches the last registry, if it exists, i uses the next available number
this.setLegajo_id(1);
}
else {
this.setLegajo_id(leg+1);
}
}
//Getters and Setters
}
empvarios:
@Entity
@Table(name="empvarios")
@PrimaryKeyJoinColumn(name="legajo_id")
public class empvarios extends empleado implements Serializable, ToPersona{
private static final long serialVersionUID = -6327388765162454657L;
@Column(name="ocupacion_id")
int ocupacion_id;
public empvarios() {
super();
this.setLegajo_id(super.getLegajo_id());
}
//Getters and setters
}
现在,如果我尝试在数据库中插入一个新的empleado,它就可以正常工作......但是如果我尝试插入一个empvarios,在应该是legajo_id的地方,hibernate放置persona_cuil(我测试过这个删除数据库上的FK限制)
下面的图片: (因信誉限制而无法发布图像:/) https://www.dropbox.com/sh/mu5c797adlf7jiv/AACnd8mx7GriSyq5OMKoddRna?dl=0 你有3张照片,文件名显示每张照片。
关于最新情况的任何想法?
答案 0 :(得分:0)
问题在于数据库被错误地映射。
如果有人遇到这个问题,那么你将不得不重新考虑数据库的结构。
如上面给出的示例所示,数据库应如下所示:
persona:
persona_id (PK-autoincemental)
empleado:
persona_id (FK to persona)
legajo_id
empvarios:
persona_id (FK to persona)
ocupacion_id
这样做的原因是因为你不能有不同的id来依赖数据库中的不同clases。在程序方面,它“可以”像这样工作,但它必须以不同的方式映射数据库。
谢谢!