2012-04-16 87 views
0

我有以下的情况下,避免了明显的代码:一对多复合主键的情况

的对象:

@Entity 
@Table(name = "poliza") 
public class Polizas implements Serializable { 
    @Id 
    @Column(name = "numero_poliza") 
    private BigDecimal numero; 
} 

一个或多个子对象:

@Entity 
@Table(name = "Autos") 
@IdClass(AutosPk.class) 
public class Autos { 
    @Id 
    @Column(name = "auto_id") 
    private BigDecimal autoId; 
    @Id 
    @ManyToOne 
    @JoinColumn(name = "numero_poliza") 
    private Polizas poliza; 
} 

主键类:

public class AutosPk { 
    private BigDecimal autoId; 
    private BigDecimal poliza; 
} 

到目前为止,一切正常。 但是,如果我需要修改汽车这个(添加其他对象的列表):

@Entity 
@Table(name = "Autos") 
@IdClass(AutosPk.class) 
public class Autos { 
    @Id 
    @Column(name = "auto_id") 
    private BigDecimal autoId; 
    @Id 
    @ManyToOne 
    @JoinColumn(name = "numero_poliza") 
    private Polizas poliza; 
    @OneToMany(mappedBy = "auto_id", cascade = { CascadeType.ALL }) 
    private List<AccesoriosAutos> accesorios; 
} 

而且孩子:

@Entity 
@Table(name = "acce_auto") 
@IdClass(AccesoriosAutosPk.class) 
public class AccesoriosAutos { 
    @Id 
    @Column(name = "cod_acces") 
    private BigDecimal codAcces; 
    @Id 
    @ManyToOne 
    @JoinColumns({@JoinColumn(name = "numero_poliza", referencedColumnName = "numero_poliza"), 
     @JoinColumn(name = "cod_auto", referencedColumnName = "cod_auto")}) 
    private Autos auto; 
} 

,并在主键类:

public class AccesoriosAutosPk { 
    private BigDecimal codAcces; 
    private AutosPk auto; 
} 

描述的映射是错误的,但我发布这种方式,因为我认为它解释了我的需要。我已经搜索了几页,但我无法找到做这种映射的方式。

预先感谢阅读,

胡安·罗梅罗

回答

0

我有几件事情从我的角度提点:

  1. 令人奇怪的是,你正在使用@IdClass @Id用。
  2. 汽车类应标注ACCESORIOS为@OneToMany(的mappedBy = “自动”,....)
  3. AccesoriosAuto自动柱只是@JoinColumn(NAME = “cod_auto”)

希望这有助于注释。

+0

谢谢您的回答。 – 2012-04-17 14:04:18

+0

我按照图2和3和I得到 注释元件上的JoinColumns [字段自动]从实体类[类AccesoriosAutos]是不完全的。当源实体类使用复合主键时,必须使用JoinColumns为每个连接列指定JoinColumn。名称和referencedColumnName元素都必须在每个这样的JoinColumn中指定。 – 2012-04-17 14:15:36

+0

对于如图1所示,如果我把Id注解我得到: 异常说明:无效复合主密钥规范。主键类[AccesoriosAutosPk类]中的主键字段或属性的名称以及实体Bean类[类AccesoriosAutos]中的主键字段或属性的名称必须对应,并且它们的类型必须相同。另外,请确保已为XML中的相应属性指定了ID元素,并且/或者在实体类的相应字段或属性中指定了@Id。 所以,我明白我需要有两个。我错了吗? – 2012-04-17 14:19:43