2012-04-07 3 views
0

이것은 이전에 작동했기 때문에 이상한 문제입니다. 그래서 저는 게임과 개발자의 두 클래스를가집니다. 그들은 많은 관계를 가지고 있습니다. 지속성 단위는 자동으로 game_developer 테이블을 만듭니다. 따라서 3 개의 테이블이 있습니다 : 게임 개발자와 game_developer. 데이터베이스에 정보를 입력 할 때. 테이블 게임과 개발자는 정상적으로 값을 얻을 수 있지만 game_developer 테이블은 비어있게됩니다. 그래서 그 관계는 인정되지 않습니다. 또한 webapp을 실행할 때 테이블 안의 모든 것을 삭제해야합니다. 개발자는 괜찮아졌지만 게임은 여전히 ​​존재합니다.지속성 단위가 많은 관계를 만들지 못함

올바른 방향으로 밀었을 때 감사드립니다.

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 
    . 
    . 
    } 

개발자 클래스

데이비드

초기화에게, 사전에 감사합니다

지속성 단위 :

<?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> 

답변

0

을 이런 종류의 디버깅 많은 도움이 로깅에서 SQL 문을 제공해야 뭔가처럼 생각 당신이 전에 물건을 유지하기 때문에 관계를 수립하십시오. 서로 다른 컬렉션에 개체를 추가 한 후에는 gameOrganizer.add..()으로 전화하십시오. 또한 개발자의 다 대다 관계에 계단식으로 지속성을 추가하십시오.

다음으로 게임을 지속하면됩니다.

+0

정말 고마워요. 그것으로 완벽하게 해결되었습니다. –

0

난 당신이 양쪽을 설정해야 대다 관계 양방향에서 생각 ...

즉, 당신이

(STABLE)을 할 경우 .getGames(). add (game);

당신은 또한

game.getDeveloper 할 필요가() ((STABLE))를 추가합니다.;

그렇지 않으면 JPA는 정말 ... 매핑 테이블에 삽입 당신은 어떤 항목을 볼 수 없습니다 왜 실패 (null의 FK1) 같은, 것, 다른면을 볼 수 없습니다

나는 상단 링크에 대해 잘 모르겠지만, 난

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

당신의 관계가 아닌 문제 :

+0

안녕하세요, 저는 이미 이렇게 생각합니다 : game.addDeveloper (devel); devel.getGames(). add (game); 톱 링크 팁 주셔서 감사합니다. 매우 편리합니다. –

관련 문제