【问题标题】:JPA, Spring and ObjectDB not updatingJPA、Spring 和 ObjectDB 未更新
【发布时间】:2011-10-13 07:40:00
【问题描述】:

我是Spring JPA与ObjectDB数据库合作的新手,但遇到了一个我无法解决的问题。

我有一个使用上述技术编写的应用程序,它工作正常,它保留新实体等(因此我认为配置 bean 没有问题),除了更新甚至最简单的OneToMany/ManyToOne关系。这些更新没有保存到数据库中,我不知道为什么。这是我的代码的 sn-p:

实体团队(1:N):

@Entity
public class Team implements Serializable {
  ...
  List<Player> squad;
  ...
  @OneToMany(mappedBy="team", cascade=CascadeType.PERSIST)
  public List<Player> getSquad() {
    return squad;
  }
  ...
}

实体玩家 (N:1)

@Entity
public class Player implements Serializable {
  ...
  private Team team;
  ...
  @ManyToOne
  public Team getTeam() {
    return team;
  }
  ...
}

这是来自控制器的 sn-p 使用 DAO 对象和问题:

public ModelAndView addPlayer(HttpServletRequest request, HttpServletResponse response) throws Exception {
  ...
  Team t = teamDao.getTeamById(1); // retrieves an object with ID=1
  Player p = playerDao.getPlayerById(1); // retrieves a player with ID=1
  t.getSquad().add(p); // adds a player to the squad -> working fine but does not persist
  System.out.println("Size of squad: " + t.getSquad().size()); // the player is there
  ...
  return new ModelAndView("index.jsp", "team", t);
}

当我尝试在index.jsp 页面中列出球队中的所有球员或尝试以同样的方式添加其他球员时,球队总是空的 - 没有任何东西保存到数据库中。既不是团队对象,也不是玩家对象。我做错了什么?

任何帮助将不胜感激。谢谢。

编辑:这是我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">

  <persistence-unit name="NewPU" transaction-type="RESOURCE_LOCAL">
    <provider>com.objectdb.jpa.Provider</provider>
    <properties>
        <property name="javax.persistence.jdbc.url" value="C:/file.odb" />
        <property name="javax.persistence.jdbc.user" value="admin"/>
        <property name="javax.persistence.jdbc.password" value="admin"/>
    </properties>
  </persistence-unit>

附:绝对路径"C:/file.odb"仅用于演示目的。

这里是 Spring 配置:

<mvc:annotation-driven />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="NewPU" />
  <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
  </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

【问题讨论】:

  • 没有彻底阅读你的代码,这可能是原因:cascade=CascadeType.PERSIST - 你只是级联持久化。

标签: java spring jpa many-to-one objectdb


【解决方案1】:

CascadeType.PERSIST 级联新对象的持久化,但您从数据库中加载一个球员并将该球员附加到您的团队。如果你想级联,你必须添加CascadeType.MERGE

cascade = {CascadeType.PERSIST, CascadeType.MERGE}

你可以看看CascadeType.ALL

【讨论】:

  • 你说得对,我应该使用 CascadeType.ALL。我刚刚改变了这一点,但什么也没发生。此外,我发现还有一些更全球性的问题,因为无法对持久化实体进行任何更改。即使是最简单的 t.setName("new name") 也不起作用。它会更改页面上对象内的名称,但不会将其保存到数据库中。我知道如果不查看整个代码就很难给出建议,但是如果有人知道可能导致这种情况的原因,我可以提供任何信息,任何代码,我只需要整理一下。谢谢
  • 我已将其附加到上述问题中。谢谢
  • 尝试使用 @Transactional 注释您的 addPlayer 控制器操作。
  • 是的!那成功了。我认为它会像那样简单:-)。我在dao的persist()方法上有@Transactional注解,甚至试图把它放在整个dao类上,但没有把它放在控制器中的方法上......非常感谢,你节省了我的时间时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多