Обновление Spring Boot 2 Hibernate не вставляется - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь обновить объект, который уже существует в моей базе данных.Сохранение объекта работает нормально, но при вызове обновления мои журналы показывают оператор выбора, но без обновления.Ниже приведен мой код.

Entity

  @Entity
    @Table(name = "items")
    public class Items implements Serializable {
        private static final long serialVersionUID = -3607451001182083512L;

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer iditems;

        @ManyToOne
        @JoinColumn(name = "idcategories")
        private Categories categories;

        @Size(min = 1, max = 35)
        private String name;

        @Size(min = 0, max = 100)
        private String description;

        private double price;
        private int hidden;
        private String upc;

        @OrderColumn
        @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.LAZY)
        @JoinTable(name = "itemsextrascat", joinColumns = { @JoinColumn(name = "iditems") }, inverseJoinColumns = { @JoinColumn(name = "idextrascat"), })
        private Set<Extrascat> extrascat = new HashSet<Extrascat>();



    Getters and Setters
    }

Служба

@Service("itemsService")
public class ItemsService {

    @Autowired
    private ItemsDao itemsDao;


    // CREATE OR UPDATE ITEM
    @PreAuthorize("hasRole('ADMIN')")
    public void createOrUpdate(Items items) {
        itemsDao.createOrUpdate(items);
    }

    // CREATE OR UPDATE ITEM
    @PreAuthorize("hasRole('ADMIN')")
    public void update(Items items) {
        itemsDao.update(items);
    }

}

DAO

@Transactional
@Component("itemsDao")
public class ItemsDao {

    @Autowired
    private EntityManagerFactory entityManagerFactory;


    // CREATE OR UPDATE ITEM
    @PreAuthorize("hasRole('ADMIN')")
    public void update(Items items) {
        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();

        session.unwrap(Session.class).merge(items);
    }
}

Я пытался использовать сохранение обновления сохранятьсяобъединить все безрезультатно.Я также попытался изменить местоположение моего @Transactional в соответствии с тем, что я прочитал в другом посте.Я также удостоверился, что мои методы не были частными, чтобы убедиться, что вызывается @Transational.Я смог решить эту проблему, внедрив репозиторий, который позволяет мне обновлять сущность.Тем не менее, я не хочу, чтобы DAO и Repository были в моем коде.Есть идеи, почему реализация Dao не работает?

1 Ответ

0 голосов
/ 23 января 2019

Вы делаете свой Дао слишком сложным.Во-первых, зачем использовать нативный спящий режим, когда достаточно простого EntityManagerЗачем использовать EntityManagerFactory для управления своим EntityManager.Наконец, вы находитесь в среде, управляемой Spring, не используйте openSession или createEntityManager, так как это даст вам нетранзакционную среду.

При этом вы можете удалить большую часть своего кода.

@Transactional
@Component("itemsDao")
public class ItemsDao {

    @PersistenceContext
    private EntityManager em;


    // CREATE OR UPDATE ITEM
    @PreAuthorize("hasRole('ADMIN')")
    public void update(Items items) {
       em.merge(items);
    }
}

Это все, что вам нужно.В основном не используйте openSession, поскольку это даст вам новый Session для спящего режима.Если вы сделаете это достаточно, в конечном итоге вы также получите не отвечающее приложение, так как используются все соединения с БД.Это потому, что вы открываете сессию, но никогда не закрываете ее.

Я хотел бы предложить, однако, поскольку вы используете Spring Boot и JPA, чтобы просто использовать Spring Data JPA и позволить этому обрабатывать все это.

public interface ItemsRepository extends CrudRepository<Items, Long> {}

Затем в своем коде просто вызовите метод save для ItemsRepository, и Spring Data JPA сделает все за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...