2014-10-07 95 views
-2

给您的情况JPA复合键@OneToOne(PersistentObjectException)

  1. 用户
  2. 发票
  3. InvoiceId类(复合键

我无法将现有的User对象(从数据库中检索到)合并到新的发票对象为什么?有什么建议么 ?

@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 2014-10-07 00:35:21

+0

@uaiHebert现在就可以查看了 – 2014-10-07 00:43:32

回答

0

您的问题是,有一种超然的实体:

脱离实体被persist:com.emad.payment.domain 。用户

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(); 

对于Spring框架在服务层,你可以这样做:

@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); 
    } 
}