2016-05-08 18 views
0

私はitineraryTravellerと呼ばれるエンティティを持ち、itineraryTravellerはすべてflightEntityを持つことができます。私は、データベースから、itineraryTraveller(親)を削除しようとすると、私は、このエラーメッセージが表示されます:@OneToMany関係で親と子の両方を削除します

@Entity 
public class itineraryTraveller implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<flightEntity> flights; 

    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date departureDate; 

    private String departureLocation; 
    private String arrivalLocation; 
    private double cost; 
    private char status; 
    private ArrayList<String> stops; 
    private String stopPrint; 
    private String userName; 
    private int iden; 

    // ... 
} 

そしてflightEntity次のようになります:

ここ

a foreign key constraint fails (`pquino01db`.`ITINERARYTRAVELLER_FLIGHTENTITY`, CONSTRAINT `FK_ITINERARYTRAVELLER_FLIGHTENTITY_flights_ID` FOREIGN KEY (`flights_ID`) REFERENCES `FLIGHTENTITY` (`ID`))" 

は私itineraryTravellerエンティティであり、

@Entity 
public class flightEntity implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date departureDate; 

    private String airlineCode; 
    private String flightNumber; 
    private String departureLocation; 
    private String arrivalLocation; 
    private double businessCost; 
    private double economyCost; 
    private int numBusinessSeats; 
    private int numEconomySeats; 

    // ... 
} 

誰かが問題を見ることができますか?私は自分の@OneToMany注釈に何かが見つからないかもしれないと思っていますが、私は何がわかりません。私は、親と子の両方を同時に削除したいと思います。あなたはflightEntity@JoinColumnを持っていないようflightEntityからのマッピングが戻っitineraryTravellerエンティティに存在しないため、2つのエンティティ間の

+0

作業を行うためにHibernateを使用していますか? – PeterS

+0

JPA Ecliplse glassfishとのリンク – pquin92

+0

私の提案はおそらく無関係ですが、使用するCascadeTypeのタイプを確認してください。Hibernateを使うべきではないかとHibernateのglassfishも同様の問題がありますか?ここをクリックしてください:http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/ – PeterS

答えて

1

あなたの関係は一方向です。次のように

  1. flightEntity@ManyToOne注釈を追加します:そこにあなたの問題のために、次のソリューションのいずれかになります。

    @Entity 
    public class flightEntity implements Serializable { 
        // .... 
    
        @ManyToOne 
        @JoinColumn(name="<name_of_foreignkey_column>") 
        private itineraryTraveller traveller; 
    
        // ... 
    } 
    

    そして、あなたはあなたの@OneToMany注釈にmappedBy属性を追加する必要があります。

    @OneToMany(mappedBy="traveller", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    

    これにより、エンティティ間の関係が双方向になります。

すでにデータベースに外部キー関係のテーブルがある場合、この方法で問題を解決できます。

@OneToMany注釈に
  • 使用@JoinTable注釈

      を:

      @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
      @JoinTable(name="<join_table_name>", [email protected]("TRAVELLER_ID"), [email protected]("FLIGHT_ID")) 
      private List<flightEntity> flights; 
      

    (列の名前は例であると考えられ、そして変更することができます。)

    この最後のマッピングは、データベースに外部キー列が定義されたテーブルを持たず、テーブル間の関連付けとして新しいテーブルを作成する場合に便利です。これは通常、多対多の関係の場合です。

    フライトエンティティで@ManyToOne注釈を使用できる場合は、これは、一対多の関係をマッピングする通常の方法です。

    最後に、Javaでは、状態クラス名は大文字で始まるという規則があります。だから私はFlightItineraryTravellerに実体名の名前を変更します。

  • +0

    ありがとうございます!私は2つのソリューションを使用しています。しかし、 "TRAVELLER_ID"も "FLIGHT_ID"も見つからない。これらの列名はどこで設定する必要がありますか? – pquin92

    +0

    'TRAVELLER_ID'と' FLIGH_ID'は私が選んだ名前です。しかし、あなたのケースでは、データベース内の正しい列名を探す必要があります。両方のテーブルの主キーを含む関連テーブルがありますか? – ujulu

    +0

    私のアプリケーションでデータベース内のすべてのテーブルを自動的に作成したいということです。だから私はむしろデータベースから操作しないでください。最初にアプリケーションをデプロイしたとき、それらのテーブルは既に存在していないでしょう – pquin92

    関連する問題