2014-01-29 3 views
0

Существует простая модель ассоциированных организаций:Получить идентификатор связанного объекта после сохранения

класс MainModel

@Entity 
@Table(name = "main_model") 
public class MainModel 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "id_main_model", referencedColumnName = "id") 
    private List<AssociatedModel> am_collection; 

    public MainModel() { } 

    public long getId() 
    { 
     return this.id; 
    } 

    public void addAssociated(AssociatedModel am) 
    { 
     am_collection.add(am); 
    } 
} 

класс AssociatedModel

@Entity 
@Table(name = "associated_model") 
public class AssociatedModel 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    public AssociatedModel() { } 

    public long getId() 
    { 
     return this.id; 
    } 
} 

Простейшее JPA хранилище MainModel

public interface MainModelDAO extends JpaRepository<MainModel, Long> 
{ 
} 

и, наконец, метод контроллера для создания и сохранения экземпляра AssociatedModel

@RequestMapping("/url") 
public String createAssociated(@RequestParam("id_mainmodel") long id_mainmodel, @RequestBody AssociatedModel newAm) 
{ 
    MainModel mm = MainModelDAOobject.findOne(id_mainmodel);// MainModelDAOobject - @Autowired 
    mm.addAssociated(newAm); 
    MainModelDAOobject.saveAndFlush(mm); 
    return String.valueOf(newAm.getId());// get Id of associated saved object 
} 

Associated obect сохраняет в базу данных правильно, но идентификатора значения этого объекта, допускаемом его методом getId(), всегда нулевой. Как я могу правильно получить идентификатор сохраненного связанного объекта?

+0

это не решит вашу проблему, но данные весны довольно круты! Посмотри на это. –

ответ

0

вам нужен sequencegenerator:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MainModel SequenceGenerator") 
@SequenceGenerator(name = "MainModel SequenceGenerator", sequenceName = "MainModel Sequence", initialValue = SEQUENCE_INITIAL_VALUE, allocationSize = SEQUENCE_ALLOCATION_SIZE) 
+0

Идентификаторы созданных записей корректно генерируются в базе данных. Я просто не могу получить их после сохранения. – gorill

1

Try вызова MainModelDAOobject.flush() после сохранения значения, но перед чтением ID.

См. this answer для получения пояснения.

Edit: попробуйте вручную сохранение newAm путем добавления новой строки:

mm.addAssociated(newAm); // Existing line 
newAm = MainModelDAOobject.save(newAm); // New line 
MainModelDAOobject.save(mm); // Existing line 
+0

Это не ясно для меня. Я не использую EntityManager. – gorill

+0

Хорошо, я предполагаю, что вы используете Spring Data JPA? Отредактировал мой ответ. –

+0

Да, я использую Spring Data JPA, и я попробовал MainModelDAO.flush() - это не имеет никакого эффекта – gorill

-1

Благодаря Дэвид Левеск за полезные предложения.

задача решается следующим образом:

  1. необходимо дополнительное хранилище для AssotiatedModel

    общедоступный интерфейс AssotiatedModelDAO расширяет JpaRepository {}

  2. затем просто сохранить связанный объект вручную:

    мм .addAssociated (newAm);

    новыйAm = AssotiatedModelDAOobject.save (newAm);

    новыйAm = MainModelDAOobject.save (newAm) `;

    MainModelDAOobject.save (mm);

+0

Рад, что вы это решили! –

Смежные вопросы