2014-10-16 115 views
0

因此,经过多次尝试并尝试按照我想要的方式进行工作,并且当然要检查不同的指南,现在我来找你们。Hibernate继承映射问题

我的计划是这样设计的工作:

角色(父对象) -persona_cuil(DB上PK,由用户生成的)

empleado(人物的儿子) -legajo_id(PK上DB,通过程序生成NOT DB(想不出使这项工作要么)) -persona_cuil(FK从角色)

empvarios(empleado的儿子) -legajo_id(从empleado PK和FK)

现在,数据库以这种方式映射,它工作得很好,问题似乎是某处的休眠混合了发送给每个对象的主键,而不是在empvarios中插入一个legajo_id,而是插入一个persona_cuil。

代码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的地方,休眠放置persona_cuil(我通过删除数据库上的FK限制来测试这个)

图片如下: (不能图片由于名誉限制:/) https://www.dropbox.com/sh/mu5c797adlf7jiv/AACnd8mx7GriSyq5OMKoddRna?dl=0 在那里你有3张照片,文件的名称显示每个表是哪一个表。

关于发生什么事情的任何想法?

回答

0

问题在于数据库被错误地映射。

如果有人有这个问题,那么你将不得不重新考虑数据库的结构。

正如我上面给的例子看出,数据库应该是这样的:

persona: 
persona_id (PK-autoincemental) 

empleado: 
persona_id (FK to persona) 
legajo_id 

empvarios: 
persona_id (FK to persona) 
ocupacion_id 

这个工作原理是这样的原因是因为你不能有不同的ID在数据库内取决于不同clases。在程序方面,它“可以”像这样工作,但它必须以不同的方式映射数据库。

谢谢!