2

トランザクションをコミットしようとすると、次のようになります。

javax.persistence.RollbackException: Transaction failed to commit
javax.persistence.PersistenceException: Object with id "" is managed by a different 
org.datanucleus.exceptions.NucleusUserException: Object with id "" is managed by a different Object ManagerObject Manager

私のコードは次のとおりです。

@Entity
public class Profile implements Serializable
{
    private static final long serialVersionUID = 1L;
    @Id     
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long profileId;

    private String m_Name;    
    private String m_Email;
    private String m_Password;  

    @ManyToOne()
    private List<MyPoint> m_points = null;
    .
    .
}

@Entity
public class MyPoint  implements Serializable 
{
    private static final long serialVersionUID = 1L;    
    @Id
    private int pointId;

    private int m_LatitudeE6;
    private int m_LongitudeE6;
    .
    .
}
  • 彼の注釈で m_points を削除すると、すべて正常に動作します。
  • Google App Engine で JPA 1.0 を使用し
    ています。何が間違っていますか?
    ありがとう。
4

1 に答える 1

1

GAEの専門家ではありませんが、エンティティマッピングには、修正が必要な明らかな問題がいくつかあります。

まず、リストにaを適用することは意味がありません(その注釈を使用すると、このエンティティの多くがマップされたエンティティの1つに関連して@ManyToOneいることを示していると考えてください)。

次に、埋め込まれたポイントのコレクションの実際のマッピング列を指定していません。ポイントクラスでポイントからプロファイルへのマッピングを定義するか、結合テーブルを使用する必要があります。以下に例を示します(非常に大まかな擬似コード)。

@Entity
public class Profile implements Serializable { 

    @OneToMany(mappedBy = "profile")
    private List<MyPoint> m_points = null;
}

@Entity
public class MyPoint implements Serializable {

    @ManyToOne
    @JoinColumn(name = "profileId")
    private Profile profile;
}

明らかに、上記の例ではprofileId、プロファイルテーブルの主キーを参照するMyPointテーブルに名前が付けられた外部キーがあることを前提としています。

于 2012-06-19T23:38:33.307 に答える