JPA, Spring и ObjectDB не обновляются - PullRequest
1 голос
/ 13 октября 2011

Я довольно новичок в Spring JPA в сотрудничестве с базой данных ObjectDB, но я столкнулся с проблемой, которую не могу решить.

У меня есть приложение, написанное с использованием упомянутых технологий, и оно работает, хорошо, оносохраняются новые сущности и т. д. (таким образом, я думаю, что нет проблем с компонентами конфигурации), за исключением обновления даже самых простых OneToMany / ManyToOne отношений.Эти обновления не сохраняются в базе данных, и я не могу понять, почему.Вот фрагмент моего кода:

Entity Team (1: N):

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

Entity Player (N: 1)

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

Вот фрагментиз контроллера с использованием обоих объектов 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>

PS Абсолютный путь "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" />

1 Ответ

1 голос
/ 13 октября 2011

CascadeType.PERSIST каскадирует постоянства нового объекта, но вы загружаете игрока из базы данных и присоединяете игрока к своей команде. Если вы хотите добавить каскад, вы должны добавить CascadeType.MERGE

cascade = {CascadeType.PERSIST, CascadeType.MERGE}

Вы можете взглянуть на CascadeType.ALL.

...