2014-10-07 2 views
-2

Здесь вы ситуацияJPA составной ключ @OneToOne (PersistentObjectException)

  1. Пользователь Класс
  2. Счет класса
  3. InvoiceID класс (составной ключ)

Я не могу объединить существующий объект пользователя (извлеченный из базы данных) в новый объект счета-фактуры, почему? какие-либо предложения ?

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

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 


    @Column(name = "USERNAME",unique = true, nullable = false , length = 50) 
    private String username; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "TIMESTAMP_OF_REGISTRATION", unique = false, nullable = true, updatable = false, columnDefinition = "TIMESTAMP") 
    private Date timestampOfRegistration; 

    @Column(name = "PASSWORD",unique = false, nullable = false , length = 60) 
    private String password; 

    @Column(name = "NON_EXPIRED",unique = false, nullable = false) 
    private boolean accountNonExpired; 

    @Column(name = "CREDENTIAL_NON_EXPIRED",unique = false, nullable = false) 
    private boolean credentialsNonExpired;  

    @Column(name = "NON_LOCKED",unique = false, nullable = false) 
    private boolean accountNonLocked; 

    @Column(name = "ENABLED",unique = false, nullable = false) 
    private boolean enabled; 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(name = "DA_USER_ROLES", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID")) 
    private Set<Role> roles; 

    // getters and setters 
} 


public class InvoiceId implements Serializable { 
    private Long id; 
    private Long user; 

    // getters , setters , equals and hashCode 
} 

@Entity 
@Table(name = "DA_INVOICE") 
@IdClass(InvoiceId.class) 
public class Invoice implements Serializable { 

    private static final long serialVersionUID = 4101444312504776489L; 

    @Id 
    @Column(name = "ID")  
    private Long id;  

    @Id 
    @OneToOne(cascade = {CascadeType.MERGE}) 
    @JoinColumn(name = "USER_ID") 
    private User user; 

    @Column(name = "TOTAL_AMOUNT", nullable = false) 
    private Double totalAmount; 

    // getters and setters 
} 


// invoice controller 
@Controller 
@RequestMapping("/invoice") 
public class InvoiceController { 
    public String createInvoice(Locale locale, Model model,@AuthenticationPrincipal SecurityUser securityUser, Pageable pageable) { 
    // getting an existing user from the database 
    User user = userRepository.findOne(securityUser.getId()); 

    Invoice invoice1 = new Invoice(); 
    invoice1.setUser(user); 
    invoice1.setId(12l); 
    invoice1.setTotalAmount(250.0); 
    invoiceRepository.save(invoice1); // org.hibernate.PersistentObjectException: detached entity passed to persist: User 

    return "invoice"; 
} 

здесь вы за исключением

+0

Почему вы не можете? Отправьте стек из исключения. – uaiHebert

+0

@uaiHebert вы можете проверить его сейчас –

ответ

0

Ваша проблема в том, что существует отдельный объект:

отдельностоящий объект передается упорствовать: com.emad.payment.domain .User

You ne чтобы транзакция открывалась во время транзакции. что-то вроде:

entityManager.getTransaction().begin(); 
User user = getUserFromDB(); 
Invoice invoice = // get the invoice or use an invoice received as method param 
user.setInvoice(invoice); 
invoice.setUser(user); 
entityManager.persist(invoice); 
entityManager.getTransaction().commit(); 

Для пружинной структуры в слое сервиса вы можете сделать что-то вроде:

@Service 
public class InvoiceService { 

    @Autowired 
    private UserRepository userRepository; 

    @Autowired 
    private InvoiceRepository invoiceRepository; 

    @Transactional 
    public void createInvoice(Long invoiceId, Double totalAmount, Long userId) { 
     User user = userRepository.findOne(userId); 
     Invoice invoice = new Invoice(); 
     invoice.setUser(user); 
     invoice.setId(invoiceId); 
     invoice.setTotalAmount(totalAmount); 
     invoiceRepository.save(invoice); 
    } 
} 
Смежные вопросы