1

JPA アノテーションと Hibernate を使用して多対多の関係を構成する方法を見つけようとしていましたが、多くの記事やフォーラムのディスカッションを読みましたが、エラーが発生しました。

最初に知りたかったのは 、属性との多対多の関係を構成する方法です

EquipementsMaintenance_Companiesの2 つのテーブルとReparationの関係があります。

リレーションシップのエンティティを追加し、他のエンティティに @OneToMany を作成すると、構成された主キーに問題があったため、コレクション アプローチを使用しましたが、その例外があります。

org.hibernate.MappingException: Repeated column in mapping for collection: mmapp.domain.Equipement.reparations column: EQUIPEMENT_FK

機器:

@Entity
@Table( name = "EQUIPEMENTS" )
public class Equipement implements Serializable{

private int id ;
private String marque ;
private int isbn ;
private Date purchaseDate ;
private double price ;
private int warrantyPeriod ;

public Equipement(){
}

public Equipement( String marque ) {
    this.marque = marque ;
}

@Id
@GeneratedValue( strategy = GenerationType.AUTO )
@Column( name = "EQUIPEMENT_ID" )
public int getId(){
    return this.id ;
}

public void setId(int id){
    this.id = id ;
}

@Column( name = "EQUIPEMENT_MARQUE" )
public String getMarque(){
    return this.marque ;
}

public void setMarque(String marque){
    this.marque = marque ;
}

@Column( name = "EQUIPEMENT_PUR_DATE" )
public Date getPurchaseDate(){
    return this.purchaseDate ;
}

public void setPurchaseDate(Date purchaseDate){
    this.purchaseDate = purchaseDate ;
}

@Column( name = "EQUIPEMENT_PRICE" )
public double getPrice(){
    return this.price ;
}

public void setPrice(double price){
    this.price = price ;
}

@ElementCollection
@JoinTable(
    name= "EQUIPEMENT_MAINTENANCE_COMPANY" ,
    joinColumns=@JoinColumn( name= "EQUIPEMENT_FK" ))
public Collection<Reparation> getReparations() {
    return reparations ;
}

public void setReparations(Collection<Reparation> reparations) {
    this.reparations = reparations ;
}

private Collection<Reparation> reparations ;

}

メンテナンス会社:

@Entity
@Table( name = "MAINTENANCE_COMPANIES" )
public class MaintenanceCompany implements Serializable{

private int id ;
private String name ;
private String adress ;
private String telephone ;

public MaintenanceCompany(){}

public MaintenanceCompany( String name ) {
    this.name = name ;
}

public void setId(int id){
    this.id = id ;
}

@Id
@GeneratedValue( strategy = GenerationType.AUTO )
public int getId(){
    return this.id ;
}

public void setName(String name){
    this.name = name ;
}

public String getName(){
    return this.name ;
}

public void setAdress(String adress){
    this.adress = adress ;
}

public String getAdress(){
    return this.adress ;
}

public void setTelephone(String telephone){
    this.telephone = telephone ;
}

public String getTelephone(){
    return this.telephone ;
}

@ElementCollection
@JoinTable(
    name= "EQUIPEMENT_MAINTENANCE_COMPANY" ,
    joinColumns=@JoinColumn( name= "COMPANY_FK" ))
public Collection<Reparation> getReparations(){
    return reparations ;
}

public void setReparations(Collection<Reparation> reparations){
    this.reparations = reparations ;
}

private Collection<Reparation> reparations ;

}

賠償

@Embeddable
public class Reparation implements Serializable{

private int delay ;
private double price ;
private Date date ;

public Reparation() {} 

public Reparation(int delay, double price, Date date) {
    this.delay = delay ;
    this.price = price ;
    this.date = date ;
}

public int getDelay() {
    return delay ;
}

public void setDelay( int delay ) {
    this.delay = delay ;
}

public double getPrice() {
    return price ;
}

public void setPrice( double price ) {
    this.price = price ;
}

public Date getDate() {
    return date ;
}

public void setDate( Date date ) {
    this.date = date ;
}

@ManyToOne( fetch = FetchType.LAZY )
@JoinColumn( name = "EQUIPEMENT_FK" )
public Equipement getEquipementRepared(){
    return equipementRepared ;
}


public void setEquipementRepared(Equipement equipementRepared) {
    this.equipementRepared = equipementRepared ;
}

private Equipement equipementRepared ;

@ManyToOne( fetch = FetchType.LAZY )
@JoinColumn( name = "COMPANY_FK" )
public MaintenanceCompany getMaintenanceCompany() {
    return maintenanceCompany ;
}

public void setMaintenanceCompany( MaintenanceCompany maintenanceCompany ) {
    this.maintenanceCompany = maintenanceCompany ;
}

private MaintenanceCompany maintenanceCompany ;
}
4

1 に答える 1

3

このマッピングはあまり意味がなく、そもそもあなたが望んでいたもの、つまり属性との多対多の関係とはかけ離れています。

多対多では、2 つのエンティティ間で結合テーブルが使用されます。この結合テーブルに 2 つ以上の ID がある場合、それはもはや結合テーブルではなく、機能エンティティであり、他のエンティティとしてマップされ、独自の自動生成 ID を持つ必要があります。

したがって、それぞれ独自に生成された ID を持つ 3 つのエンティティが必要です。

  • 装置
  • 賠償
  • メンテナンス会社

1 つの機器には多くの補償があります。1 つの MaintenanceCompany には多くの Reparation があります。1 つの Reparation には、1 つの Equipment と 1 つの MaintenanceCompany があります。

@Entity
public class Equipment
    @OneToMany(mappedBy = "equipment")
    private Set<Reparation> reparations;

    // ID, fields, methods
}

@Entity
public class MaintenanceCompany
    @OneToMany(mappedBy = "maintenanceCompany")
    private Set<Reparation> reparations;

    // ID, fields, methods
}

@Entity
public class Reparation
    @ManyToOne
    @JoinColumn(name = "equipment_id")
    private Equipment equipment;

    @ManyToOne
    @JoinColumn(name = "maintenance_company_id")
    private MaintenanceCompany maintenanceCompany;

    // ID, fields, methods
}

それと同じくらい簡単です。

于 2012-05-30T15:07:49.933 に答える