spring mvc:ManytoOne 关系问题,对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:

spring mvc: ManytoOne relation issue, object references an unsaved transient instance - save the transient instance before flushing:

我有 classes 公司和联系人与 manytoone / onetomany 关系:

公司可以有很多联系人。

我收到错误:

 object references an unsaved transient instance - save the transient instance before flushing: com.myproject.model.Company;  

当我尝试添加新联系人时。

这是我的联系人 class

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

        @Column(name="CONTACT_ID")
        @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer contactid;

        @ManyToOne
        @JoinColumn(name = "CONTACT_COMPANY")
        private Company company;
        //Getters and Setters

和我的公司class

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

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

    @OneToMany( mappedBy = "company",cascade = CascadeType.ALL )
    private List<Contacts> contact = new ArrayList<Contacts>();

我也尝试将 cascade=CascadeType.ALL 添加到 manytoone 端,但后来我收到一个错误,提示某些公司字段不能为空。 我是 spring mvc 和 hibernate 的新手,如有任何帮助,我们将不胜感激。

contactsDao

@Repository("contactsDao")
public class ContactsDAOImpl extends AbstractDao<Integer, Contacts> implements ContactsDao{

static final Logger logger = LoggerFactory.getLogger(ContactsDAOImpl.class);

    public Contacts findById(int id) {
        Contacts cp = getByKey(id);

        return cp;
    }

    public Contacts findByName(String name) {
        logger.info("SSO : {}", name);
        Criteria crit = createEntityCriteria();
        crit.add(Restrictions.eq("ssoId", name));
        Contacts cp = (Contacts)crit.uniqueResult();
        return cp;
    }

    @SuppressWarnings("unchecked")
    public List<Contacts> findAllContacts() {
        Criteria criteria = createEntityCriteria().addOrder(Order.asc("contactlastname"));
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        List<Contacts> cps = (List<Contacts>) criteria.list();

        for(Contacts cp : cps){
            Hibernate.initialize(cp.getCompany());
        }

        return cps;
    }

    public void save(Contacts cp) {

        persist(cp);
    }


    public void delete(String sso) {
        Criteria crit = createEntityCriteria();
        crit.add(Restrictions.eq("ssoId", sso));
        Contacts cp = (Contacts)crit.uniqueResult();
        delete(cp);
    }

}

联系服务

@Repository("contactsDao")
public class ContactsDAOImpl extends AbstractDao<Integer, Contacts> implements ContactsDao{

static final Logger logger = LoggerFactory.getLogger(ContactsDAOImpl.class);

    public Contacts findById(int id) {
        Contacts cp = getByKey(id);

        return cp;
    }

    public Contacts findByName(String name) {
        logger.info("SSO : {}", name);
        Criteria crit = createEntityCriteria();
        crit.add(Restrictions.eq("ssoId", name));
        Contacts cp = (Contacts)crit.uniqueResult();
        return cp;
    }

    @SuppressWarnings("unchecked")
    public List<Contacts> findAllContacts() {
        Criteria criteria = createEntityCriteria().addOrder(Order.asc("contactlastname"));
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        List<Contacts> cps = (List<Contacts>) criteria.list();

        for(Contacts cp : cps){
            Hibernate.initialize(cp.getCompany());
        }

        return cps;
    }

    public void save(Contacts cp) {

        persist(cp);
    }


    public void delete(String sso) {
        Criteria crit = createEntityCriteria();
        crit.add(Restrictions.eq("ssoId", sso));
        Contacts cp = (Contacts)crit.uniqueResult();
        delete(cp);
    }

}

联系人控制器

@Controller
public class ContactsController {

    public ContactsController() {
        System.out.println("ContactsController()");
    }

    @Autowired
    private ContactsService contactsService;

    @Autowired
    CompanyService cpService;

    @Autowired
    MessageSource messageSource;

    @InitBinder
    public void binder(WebDataBinder binder) {
        binder.registerCustomEditor(Date.class, 
                new CustomDateEditor(new SimpleDateFormat("dd-MM-yyyy"), true));
    }


    @RequestMapping(value = { "/listcontacts" }, method = RequestMethod.GET)
    public String listContacts(ModelMap model) {

        List<Contacts> contact = contactsService.findAllContacts();
        model.addAttribute("contacts", contact);
        model.addAttribute("loggedinuser", getPrincipal());
        return "contactlist";
    }

    @RequestMapping(value = { "/newcontact" }, method = RequestMethod.GET)
    public String newContact(ModelMap model) {
        Contacts contact = new Contacts();
        model.addAttribute("contact", contact);
        model.addAttribute("edit", false);
        model.addAttribute("loggedinuser", getPrincipal());
        return "addcontact";
    }

    @RequestMapping(value = { "/newcontact" }, method = RequestMethod.POST)
    public String saveContact(@Valid @ModelAttribute("contact") Contacts contact, BindingResult result,
            ModelMap model) {

        if (result.hasErrors()) {

            return "addcontact";

        }


        if(!contactsService.isContactsSSOUnique(contact.getContactid(), contact.getSsoId())){
            FieldError ssoError =new FieldError("contact","ssoId",messageSource.getMessage("non.unique.ssoId", new String[]{contact.getSsoId()}, Locale.getDefault()));
            result.addError(ssoError);
            return "addcontact";
        }

        contactsService.saveContacts(contact);

        model.addAttribute("success", "contact" + contact.getContactlastname() + " registered successfully");
        model.addAttribute("loggedinuser", getPrincipal());
        //return "success";
        return "contactlist";
    }


    @RequestMapping(value = { "/edit-contact-{ssoId}" }, method = RequestMethod.GET)
    public String editContact(@PathVariable String ssoId, ModelMap model) {
        Contacts contact = contactsService.findBySSO(ssoId);
        model.addAttribute("contact", contact);
        model.addAttribute("edit", true);
        model.addAttribute("loggedinuser", getPrincipal());
        return "addcontact";
    }


@RequestMapping(value = { "/edit-contact-{ssoId}" }, method = RequestMethod.POST)
public String updateContact(@Valid @ModelAttribute("contact") Contacts contact, BindingResult result,
        ModelMap model, @PathVariable String ssoId) {

    if (result.hasErrors()) {
        return "addcontact";
    }


    contactsService.updateContacts(contact);

    model.addAttribute("success", "contact" + contact.getContactlastname() + " updated successfully");
    model.addAttribute("loggedinuser", getPrincipal());
    return "contactlist";
}



@RequestMapping(value = { "/delete-contact-{ssoId}" }, method = RequestMethod.GET)
public String deleteContacts(@PathVariable String ssoId) {
    contactsService.deleteContactsBySSO(ssoId);
    return "redirect:/listcontact";
}


private String getPrincipal(){
    String userName = null;
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    if (principal instanceof UserDetails) {
        userName = ((UserDetails)principal).getUsername();
    } else {
        userName = principal.toString();
    }
    return userName;
}


@ModelAttribute("companies")
public List<Company> initializeCps() {
    return cpService.findAllCompanies();
}

}

在 contact.jsp 我有

<form:select path="company" id="company" items="${companies}" itemValue="id" itemLabel="name" class="form-control" />

你必须改变:

path="company"    

至:

path="company.id"    

在 JSP 页上。