Java Google应用程序引擎-id为“的对象”&引用;是由不同的JPA管理的

Java Google应用程序引擎-id为“的对象”&引用;是由不同的JPA管理的,java,google-app-engine,jpa,Java,Google App Engine,Jpa,当我尝试提交事务时,我得到: 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 d

当我尝试提交事务时,我得到:

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;
    .
    .
}
@实体
公共类配置文件实现可序列化
{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有长profileId;
私有字符串m_Name;
私人字符串m_电子邮件;
私有字符串m_密码;
@ManyToOne()
私有列表m_点=空;
.
.
}
@实体
公共类MyPoint实现可序列化
{
私有静态最终长serialVersionUID=1L;
@身份证
私有int-pointId;
私人国际博物馆6;
私人国际博物馆6;
.
.
}
  • 如果我用他的注释删除m_点,一切正常
  • 我正在使用JPA1.0和谷歌应用程序引擎
    我做错了什么?
    谢谢

    • 不是GAE专家,但您的实体映射存在一些明显的问题,需要解决

      首先,将
      @ManyToOne
      应用于列表是没有意义的(想想看,当您使用该注释时,您的注释表明此实体中的许多实体与映射实体中的一个相关)

      其次,您没有为嵌入的点集合指定实际的映射列。必须在point类上定义从点到纵断面的映射,或者使用联接表。下面是一个示例(非常粗略的伪代码):

      @实体
      公共类配置文件实现可序列化{
      @OneToMany(mappedBy=“profile”)
      私有列表m_点=空;
      }
      @实体
      公共类MyPoint实现可序列化{
      @许多酮
      @JoinColumn(name=“profileId”)
      个人资料;
      }
      

      很明显,上面的示例假定MyPoint表上有一个名为
      profileId
      的外键,它引用了Profile表上的主键。

      请参见。我看到了这个问题。虽然我们有相同的误解,但这并不重要,因为他使用的是JDO而不是JPA。你使用的是谷歌插件v1,这算是你做错了什么。使用v2,因为它修复了第一个版本中的许多问题。另一个用户使用的是JDO是的,而您使用的是JPA,他们下面有完全相同的持久化引擎,同样的答案适用于这里。您的持久性代码导致一些对象试图与2个不同的EntityManager一起使用,根据GAE JPA 2.0是实验性的。虽然你建议使用它?但我需要保持对配置文件的引用似乎很奇怪。我只想保留点列表。您不需要在point类中保留对profile的引用(我概述了您将要使用的情况),您可以使用联接表来定义关系,或者现在我想到它,甚至更好的是,使用@EmbeddedCollection)
      @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;
      }