问题描述
使用springmvc+hibernate用注解配置实体类的时候,我不使用hbm了,完全使用注解的方式不过有些实体类具有外键关系,怎么使用注解配置多对多,一对多的关系,真不知道该怎么写,百度上很难找到这类的信息有哪位大神来解释下呗?另外还有一个关于日期传递的问题代码如下实体类:@Entity@Table(name="user")publicUser{intid;//id在数据库中设置为自增了Stringname;Java.util,Datedate;publicUser(){}//getset方法就略过吧}jsp:<formid="addForm"action="/Demo/addUser"method="post"><inputtype="text"name="name"><inputtype="text"name="date"value="2014-12-1816:22:22">//这个其实是用控件获得,不过现在先给他一个默认值<inputtype="submit"></form>controller:我原来希望使用springmvc的自动绑定功能@RequestMapping("/addUser")publicStringaddEvent(Useruser){userService.save(user);//userService就是一个简单的调用dao层的service层对象,save就是单纯的添加}这样会报错,传递参数,日期的date会变成空,编号400的错误,把日期当做普通数据接收,在后台转换后赋值就可以,如下:@RequestMapping("/addUser")publicStringaddEvent(Stringname.Stringdate){Useruser=null;SimpleDateFormatsim=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");try{Datedate2=sim.parse(date);user.setName(name);user.setName(date2);userService.save(user);}catch(ParseExceptione){e.printStackTrace();}}但是这样做,就没法使用springmvc的自动绑定了..找了好久,有人有一样的问题,但是他们的解决方法都不行,,搞了好久,,有人有有亲身经验吗?求大神指点呀.万分感谢
解决方案
解决方案二:
@ManyToOne@JoinColumn(name="外键")get方法set方法
解决方案三:
引用1楼u011514731的回复:
@ManyToOne@JoinColumn(name="外键")get方法set方法
外键?怎么写,我还没有建表,我希望他自动帮我创建,比如我User表内:List<Teacher>teachers;就这个要怎么写?
解决方案四:
你把对象间的关系描述清楚下user和teacher一对多??
解决方案五:
引用3楼u011514731的回复:
你把对象间的关系描述清楚下user和teacher一对多??
多对多,一个学生有多个老师教,一个老师教多个学生,他们实体类中都有一个list对象,存放对放的对象集合
解决方案六:
对于多对多的关系,一般都会建个中间表,换成一对多的关系。一对多的关系:主表model参考如下代码@NotCloneprivatetransientList<子表对象>子表集合=newArrayList<子表对象>();@OneToMany(fetch=FetchType.LAZY,mappedBy="主表实例")@JoinColumn(name="子表id")publicList<子表>get(){}publicvoidset(List<子表>s){}子表model@ManyToOne@JoinColumn(name="主表id")public主表对象get(){}set(){}下班了,你先看看,明天再说
解决方案七:
引用5楼u011514731的回复:
对于多对多的关系,一般都会建个中间表,换成一对多的关系。一对多的关系:主表model参考如下代码@NotCloneprivatetransientList<子表对象>子表集合=newArrayList<子表对象>();@OneToMany(fetch=FetchType.LAZY,mappedBy="主表实例")@JoinColumn(name="子表id")publicList<子表>get(){}publicvoidset(List<子表>s){}子表model@ManyToOne@JoinColumn(name="主表id")public主表对象get(){}set(){}下班了,你先看看,明天再说
恩我去试试,
解决方案八:
引用5楼u011514731的回复:
对于多对多的关系,一般都会建个中间表,换成一对多的关系。一对多的关系:主表model参考如下代码@NotCloneprivatetransientList<子表对象>子表集合=newArrayList<子表对象>();@OneToMany(fetch=FetchType.LAZY,mappedBy="主表实例")@JoinColumn(name="子表id")publicList<子表>get(){}publicvoidset(List<子表>s){}子表model@ManyToOne@JoinColumn(name="主表id")public主表对象get(){}set(){}下班了,你先看看,明天再说
说来,,其实我想要的是多对多呀,,不是一对多...
解决方案九:
@ManyToMany(targetEntity=teacher.class, cascade={CascadeType.MERGE,CascadeType.PERSIST} ) @JoinTable(name="student_teacher", joinColumns={@JoinColumn(name="student_id")}, inverseJoinColumns={@JoinColumn(name="teacher_id")} )private Set teacher;set{}get{}
解决方案十:
引用8楼u011514731的回复:
@ManyToMany(targetEntity=teacher.class, cascade={CascadeType.MERGE,CascadeType.PERSIST} ) @JoinTable(name="student_teacher", joinColumns={@JoinColumn(name="student_id")}, inverseJoinColumns={@JoinColumn(name="teacher_id")} )private Set teacher;set{}get{}
Role表:@Entity@Table(name="role_info")publicclassRole{@Id@GeneratedValue(generator="paymentableGenerator")@GenericGenerator(name="paymentableGenerator",strategy="native")privateintrole_id;privateList<Permission>permissions=newArrayList<Permission>();publicRole(){}publicintgetRole_id(){returnrole_id;}publicvoidsetRole_id(introle_id){this.role_id=role_id;}@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)@JoinTable(name="Role_Permission",joinColumns={@JoinColumn(name="Role_id",referencedColumnName="role_id")},inverseJoinColumns={@JoinColumn(name="Permission_id",referencedColumnName="permission_id")})publicList<Permission>getPermissions(){returnpermissions;}publicvoidsetPermissions(List<Permission>permissions){this.permissions=permissions;}}Permission表:@Entity@Table(name="permission_info")publicclassPermission{@Id@GeneratedValue(generator="paymentableGenerator")@GenericGenerator(name="paymentableGenerator",strategy="native")privateintpermission_id;privateList<Role>roles=newArrayList<Role>();publicPermission(){}publicintgetPermission_id(){returnpermission_id;}publicvoidsetPermission_id(intpermission_id){this.permission_id=permission_id;}@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)@JoinTable(name="Role_Permission",joinColumns={@JoinColumn(name="Permission_id",referencedColumnName="permission_id")},inverseJoinColumns={@JoinColumn(name="Role_id",referencedColumnName="role_id")})publicList<Role>getRoles(){returnroles;}publicvoidsetRoles(List<Role>roles){this.roles=roles;}}就是这样的两个实体类,,运行后会出错org.hibernate.MappingException:Couldnotdeterminetypefor:java.util.List,attable:permission_info,forcolumns:[org.hibernate.mapping.Column(roles)]
解决方案十一:
引用8楼u011514731的回复:
@ManyToMany(targetEntity=teacher.class, cascade={CascadeType.MERGE,CascadeType.PERSIST} ) @JoinTable(name="student_teacher", joinColumns={@JoinColumn(name="student_id")}, inverseJoinColumns={@JoinColumn(name="teacher_id")} )private Set teacher;set{}get{}
等下..我现在不会报错了,,但是数据库里面也没有多外键,,这是什么回事?
解决方案十二:
import看看是不是这样的importjava.util.ArrayList;importjava.util.List;importjavax.persistence.CascadeType;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.JoinTable;importjavax.persistence.ManyToMany;importjavax.persistence.Table;importorg.hibernate.annotations.Entity;importorg.hibernate.annotations.GenericGenerator;
解决方案十三:
引用11楼u011514731的回复:
import看看是不是这样的importjava.util.ArrayList;importjava.util.List;importjavax.persistence.CascadeType;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.JoinTable;importjavax.persistence.ManyToMany;importjavax.persistence.Table;importorg.hibernate.annotations.Entity;importorg.hibernate.annotations.GenericGenerator;
恩一样的,,,有人说要自己建表,自己建中间表,自己建外键,要这样才能实现多对多关系吗,这么麻烦
解决方案十四:
/***转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");CustomDateEditoreditor=newCustomDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}
至于为什么我也不是特别清楚!
解决方案十五:
引用13楼Acana_Dendi的回复:
/***转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");CustomDateEditoreditor=newCustomDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}至于为什么我也不是特别清楚!
这个能用?我好似试过,不行的
解决方案:
如果是配置不会写的话,建议用hibernate的反向生成,可直接生成一对多,多对一的关系,
解决方案:
引用15楼qq510992555的回复:
如果是配置不会写的话,建议用hibernate的反向生成,可直接生成一对多,多对一的关系,
反向生成吗,我也想这样,,可是不知道为什么不会自动建表..看不懂呀
解决方案:
引用14楼horizon47的回复:
Quote: 引用13楼Acana_Dendi的回复:
/***转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");CustomDateEditoreditor=newCustomDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}至于为什么我也不是特别清楚!
这个能用?我好似试过,不行的
能用啊,我晒下完整的。publicclassBaseController{/***SpringMVC自定义字段类型*@paramrequest*@parambinder*@throwsException*/@InitBinderprotectedvoidinitBinder(HttpServletRequestrequest,ServletRequestDataBinderbinder)throwsException{BinderDate(binder);}/***转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");CustomDateEditoreditor=newCustomDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}
在你要写的Controller中继承BaseController,再重写这个方法/***重写转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");CustomDateEditoreditor=newDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}
解决方案:
引用17楼Acana_Dendi的回复:
Quote: 引用14楼horizon47的回复:
Quote: 引用13楼Acana_Dendi的回复:
/***转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");CustomDateEditoreditor=newCustomDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}至于为什么我也不是特别清楚!
这个能用?我好似试过,不行的
能用啊,我晒下完整的。publicclassBaseController{/***SpringMVC自定义字段类型*@paramrequest*@parambinder*@throwsException*/@InitBinderprotectedvoidinitBinder(HttpServletRequestrequest,ServletRequestDataBinderbinder)throwsException{BinderDate(binder);}/***转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");CustomDateEditoreditor=newCustomDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}
在你要写的Controller中继承BaseController,再重写这个方法/***重写转换时间格式*@parambinder*/protectedvoidBinderDate(ServletRequestDataBinderbinder){DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");CustomDateEditoreditor=newDateEditor(df,false);binder.registerCustomEditor(Date.class,editor);}
呀..我试试I哈
解决方案:
引用
horizon47
行了不
解决方案:
引用19楼Acana_Dendi的回复:
引用
horizon47行了不
还没试,,早上有别的事要做...说来你是怎么选择框架版本的,比如选择spring3.2+hibernate3.2...能说出为什么吗
解决方案:
引用20楼horizon47的回复:
Quote: 引用19楼Acana_Dendi的回复:
引用
horizon47行了不
还没试,,早上有别的事要做...说来你是怎么选择框架版本的,比如选择spring3.2+hibernate3.2...能说出为什么吗
Spring3.1+Hibernate3.3,百度搜下customdateeditor就知道了
解决方案:
引用21楼Acana_Dendi的回复:
Spring3.1+Hibernate3.3,百度搜下customdateeditor就知道了
这和版本有什么关系哦...我只是想知道选择这些版本的依据
解决方案:
引用22楼horizon47的回复:
Quote: 引用21楼Acana_Dendi的回复:
Spring3.1+Hibernate3.3,百度搜下customdateeditor就知道了这和版本有什么关系哦...我只是想知道选择这些版本的依据
我今年刚入职,框架也是老大搭的,一直用着这个框架。
解决方案:
引用23楼Acana_Dendi的回复:
Quote: 引用22楼horizon47的回复:
Quote: 引用21楼Acana_Dendi的回复:
Spring3.1+Hibernate3.3,百度搜下customdateeditor就知道了这和版本有什么关系哦...我只是想知道选择这些版本的依据
我今年刚入职,框架也是老大搭的,一直用着这个框架。
我也刚入职(其实才实习)我是做了一个小项目,然后老大看的时候,问我为什么选择spring3.2,.,我直接蒙了,,我都是随便拿过去的项目版本来用的
解决方案:
引用19楼Acana_Dendi的回复:
引用
horizon47行了不
说来真的可以哦但是...如果是这样的怎么办SimpleDateFormatsim=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");SimpleDateFormatsimwarn=newSimpleDateFormat("yyyy-MM-dd");
我需要他传过来两种的时间类型...我实体类中一个是sql的date.一个是util的...