0

以前は機能していたので、これは奇妙な問題です。つまり、ゲームと開発者の2つのクラスがあります。彼らは多対多の関係を持っています。永続性ユニットは、テーブルgame_developerを自動的に作成します。したがって、ゲーム開発者とgame_developerの3つのテーブルがあります。データベース内に情報を入力すると。テーブルゲームと開発者は通常どおり値を取得しますが、テーブルgame_developerは空のままになります。したがって、関係は認識されません。また、Webアプリを実行すると、テーブル内のすべてが削除されます。開発者は元気に落ちますが、ゲームはまだ存在していません。

正しい方向へのプッシュは大歓迎です。

前もって感謝します、

デビッド

初期化:

try {
        gameOrganizer = (GameOrganizer) getServletContext().getAttribute("database");

        Game game = new Game("Counter Strike: source");
        Game game2 = new Game("Battlefield: bad company 3");
        Game game3 = new Game("Killing floor");

        Developer devel = new Developer("valve");
        Developer devel2 = new Developer("EA Games");
        Developer devel2b = new Developer("DICE");
        Developer devel3 = new Developer("Ubisoft");

        //The GameOrganizer is the controller between the model en the view. 
        //The view being the website.
        //So gameOrganizer.addGame(game) will persist the object to the database.

        gameOrganizer.addGame(game);
        gameOrganizer.addGame(game2);
        gameOrganizer.addGame(game3);

        gameOrganizer.addDeveloper(devel);
        gameOrganizer.addDeveloper(devel2);
        gameOrganizer.addDeveloper(devel2b);
        gameOrganizer.addDeveloper(devel3);

        game.addDeveloper(devel);
        devel.getGames().add(game);

        game2.addDeveloper(devel2);
        devel2.getGames().add(game2);

        game2.addDeveloper(devel2b);
        devel2b.getGames().add(game2);

        game3.addDeveloper(devel3);
        devel3.getGames().add(game3);

    } catch (DatabaseException ex) {
        Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex);
    } catch (DomainException ex) {
        Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex);
    }

ゲームクラス:

@Entity
public class Game implements Serializable{

    private String gameNaam;
    private double prijs;
    @ManyToMany(mappedBy = "games")
    private Collection<Developer> developers = new ArrayList<Developer>();

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

    public Game(){};
    .
    .
    //methods
    .
    .
  }

Developerクラス

@Entity
public class Developer implements Serializable  {

    private String naam;
    private String info;
    @ManyToMany
    private Collection<Game> games = new ArrayList<Game>();
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    public Developer() {
    }
    .
    .
    //methods
    .
    .
 }

永続性ユニット:

  <?xml version="1.0" encoding="UTF-8"?>
 <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
 <persistence-unit name="GameDatabaseSitePU" transaction-type="RESOURCE_LOCAL">
   <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <class>domainmodel.Developer</class>
    <class>domainmodel.Game</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="toplink.jdbc.user" value="app"/>
      <property name="toplink.jdbc.password" value="app"/>
      <property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/GameDatabase;create=true"/>
      <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>
4

2 に答える 2

0

双方向の多対多の関係では、両側を設定する必要があると思います...

つまり、あなたがそうするなら

devel.getGames()。add(game);

あなたもする必要があります

game.getDeveloper()。add(devel);

そうしないと、JPAは実際には反対側を認識せず、マッピングテーブルへの挿入は(FK1、null)のようになり、失敗します。そのため、エントリは表示されません...

トップリンクについてはよくわかりませんが、

<property name="toplink.logging.level" value="FINE"/>

これらの種類の問題をデバッグするのに役立つSQLステートメントをログに記録する必要があります:)

于 2012-04-07T20:57:29.813 に答える
0

関係を確立する前にオブジェクトを永続化するため、関係は認識されません。gameOrganizer.add..()オブジェクトをお互いのコレクションに追加した後、呼び出しを行います。また、開発者の多対多の関係にカスケードの永続化を追加します。

@ManyToMany(cascade = CascadeType.PERSIST, mappedBy = "games")
private Collection<Developer> developers = new ArrayList<Developer>();

その後、ゲームを永続化するだけで済みます。

于 2012-04-07T21:00:01.870 に答える