Spring MVC Hibernate多对一为外键提供空值
我需要一些关于SpringMVC4和Hibernate5(目前都是最新版本)的帮助 我有两个班——成员和家庭。成员(员工)可以有多个家庭成员 我希望与家庭阶级有多对一的关系 成员类的快照:Spring MVC Hibernate多对一为外键提供空值,spring,hibernate,model-view-controller,mapping,many-to-one,Spring,Hibernate,Model View Controller,Mapping,Many To One,我需要一些关于SpringMVC4和Hibernate5(目前都是最新版本)的帮助 我有两个班——成员和家庭。成员(员工)可以有多个家庭成员 我希望与家庭阶级有多对一的关系 成员类的快照: @Entity @Table(name = "member") public class Member { @Id @Column(name = "member_id") @GeneratedValue private int id; private String
@Entity
@Table(name = "member")
public class Member {
@Id
@Column(name = "member_id")
@GeneratedValue
private int id;
private String firstName;
private String middleName;
@OneToMany(cascade = CascadeType.ALL, mappedBy="member")
private List<Family> families;
.....
}
控制器:
`@RequestMapping("/admin/memberManagement/addMember")
public ModelAndView addMember(@ModelAttribute("member") Member member) {
ModelAndView view = new ModelAndView("addMember");
return view;
}
@RequestMapping(value = "/admin/memberManagement/addMember", method = RequestMethod.POST)
public ModelAndView addMemberPost(@ModelAttribute("member") Member member, Model model) {
memberService.addMember(member);
ModelAndView view = new ModelAndView("redirect:/admin/memberManagement");
return view;
}`
该表单有一个成员,其中包含相应族的列表(动态添加的字段),当我运行该程序时,它会毫无问题地保存该成员,它也会保存族的列表,但族表中的成员id值为null
我错过了什么?我感谢你的帮助。我正在学习SpringMVC
谢谢
马迪斯
**补充资料/问题**
按照Alexander Staroselsky的回答,我尝试了几个选项,但family表中的member_id列仍然为空。在服务器启动时,它会生成以下sql表和约束:
Hibernate:
alter table family
drop
foreign key FKpv3nain50fsmms2j4xdig4f8u
Hibernate:
drop table if exists family
Hibernate:
drop table if exists hibernate_sequence
Hibernate:
drop table if exists member
Hibernate:
create table family (
id integer not null,
email varchar(255),
firstName varchar(255),
lastName varchar(255),
mobile varchar(255),
relation varchar(255),
member_id integer,
primary key (id)
)
Hibernate:
create table hibernate_sequence (
next_val bigint
)
Hibernate:
insert into hibernate_sequence values ( 1 )
Hibernate:
insert into hibernate_sequence values ( 1 )
Hibernate:
create table member (
member_id integer not null,
discharge datetime,
email varchar(255),
firstname varchar(255),
lastname varchar(255),
middlename varchar(255),
mobile varchar(255),
number varchar(255),
rank varchar(255),
regiment varchar(255),
telephone varchar(255),
website varchar(255),
primary key (member_id)
)
Hibernate:
alter table family
add constraint FKpv3nain50fsmms2j4xdig4f8u
foreign key (member_id)
references member (member_id)
它正确地创建了表并添加了必要的约束。是否与hibernate和SpringMVC版本有关?有人遇到过这个问题吗?我使用的版本是:
<properties>
<spring.version>4.3.5.RELEASE</spring.version>
<security.version>4.2.1.RELEASE</security.version>
<jdk.version>1.8</jdk.version>
<hibernate.version>5.2.6.Final</hibernate.version>
<org.aspectj-version>1.8.0</org.aspectj-version>
<mysql.connector-version>6.0.5</mysql.connector-version>
<jackson.databind-version>2.8.5</jackson.databind-version>
<tiles.version>3.0.7</tiles.version>
</properties>
sql插入看起来很正常——除了族表中的成员id之外,所有其他值都存在
两个表上插入的测试值:
mysql> select * from member;
+-----------+----------------+-----------+----------+---------+
| member_id | email | firstname | lastname | website |
+-----------+----------------+-----------+----------+---------+
| 1 | test@email.com | firstname | lastname | dot.com |
+-----------+----------------+-----------+----------+---------+
1 row in set (0.00 sec)
mysql> select * from family;
+----+----------------+-----------+----------+--------+-----------+
| id | email | firstName | lastName | mobile | member_id |
+----+----------------+-----------+----------+--------+-----------+
| 1 | test@email.com | test1 | test` | i3i3 | NULL |
| 2 | test@gmail.com | test2 | test2 | 7373 | NULL |
+----+----------------+-----------+----------+--------+-----------+
2 rows in set (0.00 sec)
谢谢
再来一次测试
我刚刚删除了mappedBy=“member”以测试它是否在单独的表中工作。它工作得非常好。正如预期的那样,它创建了第三个表——member_family——并正确插入了id值。以下为试验值:
mysql> select * from member;
+-----------+----------------+-----------+----------+---------+
| member_id | email | firstname | lastname | website |
+-----------+----------------+-----------+----------+---------+
| 1 | test@email.com | tre | jjj | dot.com |
+-----------+----------------+-----------+----------+---------+
1 row in set (0.00 sec)
mysql> select * from family;
+----+-----------------+-----------+----------+----------+-----------+
| id | email | firstName | lastName | mobile | member_id |
+----+-----------------+-----------+----------+----------+-----------+
| 1 | dkdke@email.com | test | teke | d8i38303 | NULL |
| 2 | e@gmai.com | test1 | testie | 38383 | NULL |
+----+-----------------+-----------+----------+----------+-----------+
2 rows in set (0.00 sec)
mysql> select * from member_family;
+------------------+-------------+
| Member_member_id | families_id |
+------------------+-------------+
| 1 | 1 |
| 1 | 2 |
+------------------+-------------+
现在,问题似乎只出现在地图上(我可能错过了这一点)。任何指点都将不胜感激。
谢谢尝试将
@GeneratedValue
替换为@GeneratedValue(strategy=GenerationType.AUTO)
以确保为每个对象生成ID:
...
public class Member {
@Id
@Column(name = "member_id")
@GeneratedValue(GenerationType.AUTO)
private int id;
...
...
public class Family {
@Id
@GeneratedValue(GenerationType.AUTO)
private int id;
private String firstName;
private String email;
private String mobile;
...
亚历山大,谢谢你的回答。@GeneratedValue(GenerationType.AUTO)为成员和族的主键提供了自动生成的值,但族表中的member_id列仍然为空(而不是memberId值。我还可以在这里尝试其他内容吗?谢谢,请尝试
GenerationType.Identity
(javax.persistence.GenerationType.Identity)不要使用GenerationType.AUTO
。也可以尝试将unique=true,nullable=false
添加到成员的@列
参数中。我认为这不是hibernate/spring版本的问题。您能显示插入值的SQL吗?嗨,Alexander,谢谢您的消息。更改为这些值也不起作用。我有u用SQL insert更新了我的问题。谢谢,
mysql> select * from member;
+-----------+----------------+-----------+----------+---------+
| member_id | email | firstname | lastname | website |
+-----------+----------------+-----------+----------+---------+
| 1 | test@email.com | tre | jjj | dot.com |
+-----------+----------------+-----------+----------+---------+
1 row in set (0.00 sec)
mysql> select * from family;
+----+-----------------+-----------+----------+----------+-----------+
| id | email | firstName | lastName | mobile | member_id |
+----+-----------------+-----------+----------+----------+-----------+
| 1 | dkdke@email.com | test | teke | d8i38303 | NULL |
| 2 | e@gmai.com | test1 | testie | 38383 | NULL |
+----+-----------------+-----------+----------+----------+-----------+
2 rows in set (0.00 sec)
mysql> select * from member_family;
+------------------+-------------+
| Member_member_id | families_id |
+------------------+-------------+
| 1 | 1 |
| 1 | 2 |
+------------------+-------------+
...
public class Member {
@Id
@Column(name = "member_id")
@GeneratedValue(GenerationType.AUTO)
private int id;
...
...
public class Family {
@Id
@GeneratedValue(GenerationType.AUTO)
private int id;
private String firstName;
private String email;
private String mobile;
...