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;
}
描述的映射是错误的,但我发布这种方式,因为我认为它解释了我的需要。我已经搜索了几页,但我无法找到做这种映射的方式。
预先感谢阅读,
胡安·罗梅罗
谢谢您的回答。 – 2012-04-17 14:04:18
我按照图2和3和I得到 注释元件上的JoinColumns [字段自动]从实体类[类AccesoriosAutos]是不完全的。当源实体类使用复合主键时,必须使用JoinColumns为每个连接列指定JoinColumn。名称和referencedColumnName元素都必须在每个这样的JoinColumn中指定。 – 2012-04-17 14:15:36
对于如图1所示,如果我把Id注解我得到: 异常说明:无效复合主密钥规范。主键类[AccesoriosAutosPk类]中的主键字段或属性的名称以及实体Bean类[类AccesoriosAutos]中的主键字段或属性的名称必须对应,并且它们的类型必须相同。另外,请确保已为XML中的相应属性指定了ID元素,并且/或者在实体类的相应字段或属性中指定了@Id。 所以,我明白我需要有两个。我错了吗? – 2012-04-17 14:19:43