Play 2.3.4 Java - JPA oneToMany 不保存外键。请检查哪里出错了

Posted

技术标签:

【中文标题】Play 2.3.4 Java - JPA oneToMany 不保存外键。请检查哪里出错了【英文标题】:Play 2.3.4 Java - JPA oneToMany not saving foreign key. Please check where am going wrong 【发布时间】:2014-09-22 13:21:23 【问题描述】:

这里是实体 sn-p.......忽略 DaoObject..它只是将自动生成的 Id 添加到它的子类的每个实体。

我已经强调了持久化内容所必需的。最终它无法为流表中的 contentid 列添加值。它虽然使用以下代码在内容和流表中添加了一行..

请检查并帮我解决问题

          Content newContent = TestHelper.contentFactory(null, "streamForCREATE_IT", xxxx, 100);
          Stream stream = TestHelper.streamFactory(null, "name", "appname",);
          **stream.setContent(newContent);
          List<Stream> streams = new ArrayList<Stream>();
          streams.add(stream);
          newContent.setStreams(streams);**


@Entity
public class Content extends DaoObject 
  public Content() 
  ;

  private String name;
  private ContentType type;
  @OneToMany(fetch = FetchType.EAGER, mappedBy = "content", cascade = CascadeType.PERSIST,CascadeType.MERGE, orphanRemoval = true)
  @JsonManagedReference
  private List<Stream> streams = new ArrayList<Stream>();
  public String getName() 
    return name;
  
  public void setName(String name) 
    this.name = name;
  
  public List<Stream> getStreams() 
    return streams;
  
  public void setStreams(List<Stream> streams) 
    this.streams = streams;
  
    public void addStream(Stream newStream) 
    if (streams == null) 
      streams = new ArrayList<Stream>();
    
    newStream.setContent(this);
    streams.add(newStream);
  


@Entity
public class Stream extends DaoObject 
  public Stream() 
  
  @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  @JoinColumn(name = "contentid")
  @JsonBackReference
  private Content content;**
  private String name;
  private String appName;
  public Content getContent() 
  return content;
  
  public void setContent(Content content) 
  this.content = content;
  
  public String getName() 
  return name;
  
  public void setName(String name) 
  this.name = name;
  
  public String getAppName() 
  return appName;
  
  public void setAppName(String appName) 
  this.appName = appName;
  
 

这是来自 mysql 工作台的图像。

【问题讨论】:

您没有展示您坚持的方式/内容。 @AndreiI 我添加了截图以供参考。请注意,上面添加的代码中的实体没有多余的列 我的意思是:在某个地方调用 JPA.em(),然后调用 persist。你能告诉我们那部分吗? dao 被注入 JavaService @Override public void saveNew(DaoObject elt) JPA.em().persist(elt); @ Override public JavaServiceResult createContent(Content content) throws ServiceException if (content.getName() == null || content.getType() == null || content.getCpm() == 0) throw new ServiceException(UserCreateServiceJavaImpl .class.getName(), BAD_REQUEST, "必填字段缺失!", Messages.get("content.create.error.mandatory.fields.missing")); dao.saveNew(内容);返回 JavaServiceResult.buildServiceResult(创建,内容); 哇,这真的很奇怪。在我的测试课程中,我确实在任一侧调用了 set 以保持关系可用。它没有用。 【参考方案1】:

该死的,这太愚蠢了。我正在测试发生这种情况的 REST API,我确实为内容和每个流的内容正确设置了流,但这一切都发生在 JSON 转换之前。当在 dao 中重新创建此关联时,它起作用了。感谢@AndreiI 提出正确的问题,帮助我解决了这个问题。

【讨论】:

以上是关于Play 2.3.4 Java - JPA oneToMany 不保存外键。请检查哪里出错了的主要内容,如果未能解决你的问题,请参考以下文章

JPA关系映射之one-to-one

JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序

jpa CriteriaQueryNo explicit selection and an implicit one could not be determined

Spring boot入门之-Jpa- One to Many Many to one

JPA关系映射之one-to-many和many-to-one

使用 play framework 1.+ 指定图像名称(使用 play.db.jpa.blob)