Как сохранить составной класс - PullRequest
0 голосов
/ 21 мая 2019

У меня есть этот класс, я хочу сохранить этот класс, но только я получаю ошибки.

@Entity
@Table(name = "Participant")
public class Participant {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinColumn(name="user_id")
    User user;

    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JoinColumn(name="meet_id")
    Meet meet;

    @Enumerated(EnumType.STRING)
    @Column(name = "rol")
    Rol rol;
}

Когда я пытаюсь сохранить, я получаю эту ошибку:

2019-05-20 22:03:29.637 ERROR 17416 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exceptio
n [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.example.demo.model.User; nested exceptio
n is org.hibernate.PersistentObjectException: detached entity passed to persist: com.example.demo.model.User] with root cause

org.hibernate.PersistentObjectException: detached entity passed to persist: com.example.demo.model.User
        at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
        at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:765) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
        at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:758) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]

какразрешить мою проблему?

в моем сервисе я делаю это

public class MeetServiceImpl {
@Autowired
MeetRepository meetRepository;

@Autowired
UserRepository userRepository;

@Autowired
ParticipantRepository participantRepository;

static Logger log = Logger.getLogger(MeetServiceImpl.class.getName());

public Meet createMeet(Long idUser, Meet meet) {
    Meet currentMeet = meetRepository.findByName(meet.getName());
    User user = userRepository.findById(idUser);
    Participant participant = new Participant();

        participant.setRol(Rol.OWNER);
        Meet meet1 = new Meet();
        meet1.setName("nuevo");
        meet1.setState(State.start);

        participant.setMeet(meet1);
        participant.setUser(user);
        participantRepository.save(participant);
        return meetRepository.save(meet);
}

Я не понимаю, в чем проблема, что я делаю неправильно, это, кажется, не имеет логики

ДОПОЛНИТЕЛЬНО: это модель, ниже я покажу модель о классах, которые я использую

@Entity
@Table(name = "Meet")
public class Meet implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(unique = true, name = "name")
    private String name;

    @Enumerated(EnumType.STRING)
    @Column(name = "state")
    private State state;

и класс Meet

@Entity
@Table(name = "User")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "password")
    private String password;

    @Column(unique = true, name = "email")
    private String email;

    @Enumerated(EnumType.STRING)
    @Column(name = "life")
    Life life;

, когда я комментирую идентификаторы

// @ GeneratedValue (стратегии = GenerationType.AUTO)

я получаю эту ошибку

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'

Ответы [ 3 ]

0 голосов
/ 21 мая 2019

вы сделали двойную вставку в объект Meet:

participantRepository.save(participant);
return meetRepository.save(meet);

Проблемы заключаются в следующем: 1-Первая строка (1) сохраняет участника и встречу, потому что вы написали в классе участников:

@OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
 @JoinColumn(name="meet_id")
 Meet meet;

, поэтому каждый раз, когда вы сохраняете участника, связанного с собранием, собрание сохраняется автоматически

2 - когда вы комментируете эту строку: // @ GeneratedValue (стратегии = GenerationType.AUTO) идентификатор не генерируется, поэтому у нас есть две встречи, которые в состоянии вставки генерируют с помощью jpa с идентификатором 0., так что база данных говорит: Дублирующая запись '0' для ключа 'PRIMARY'

0 голосов
/ 21 мая 2019

если вы используете Spring JPA с Entity Manager, вы можете добавить @Transactional поверх уровня обслуживания.

 @Transactional
    public class MeetServiceImpl {
0 голосов
/ 21 мая 2019

Ваш метод создания не выглядит транзакционным. Не могли бы вы добавить @Transactional поверх вашего класса или метода.

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