Spring MVC Hibernate多对一为外键提供空值

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

我需要一些关于SpringMVC4和Hibernate5(目前都是最新版本)的帮助

我有两个班——成员和家庭。成员(员工)可以有多个家庭成员 我希望与家庭阶级有多对一的关系

成员类的快照:

@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;
...