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

时间:2018-04-13 11:58:58

标签: hibernate spring-mvc one-to-many many-to-one

我有班级公司和联系人与许多人/ onetomany关系:

公司可以有很多联系方式。

我收到错误:

var componentsGuidsConcat = componentsGuid
    .Select(p => AssemblyGuid.ToString() + PartGuid.ToString())
    .ToList();

var componentsDb = Context.Components
    .Where(p => componentsGuidsConcat.Contains(
        p.AssemblyGuid.ToString() + p.PartGuid.ToString())
    );

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

这是我的联系班级

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

和我的公司班级

@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

我尝试将@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>(); 添加到多方面,但后来我收到一些错误,即某些公司字段不能为空。 我是初学mvc和hibernate的新手,任何帮助都将不胜感激。

contactsDao

cascade=CascadeType.ALL

的ContactService

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

}

的ContactController

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

}

}

在contact.jsp我有

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

1 个答案:

答案 0 :(得分:0)

你必须改变:

path="company"    

为:

path="company.id"    

在JSP页面上。