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 页上。
我有 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 页上。