【问题标题】:Spring MVC Hibernate Many to One is giving null value for the foreign keySpring MVC Hibernate Many to One 为外键提供空值
【发布时间】:2017-05-31 21:32:03
【问题描述】:

我需要一些有关 Spring MVC 4 和 hibernate 5(目前都是最新版本)的帮助。

我有两个班级——会员和家庭。 Member(Staff) 可以有多个家庭成员 我想与 Family 类建立多对一关系。

Member 类的快照:

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

    .....

    }

Family 类的快照:

@Entity
@Table(name="family")
public class Family {

    @Id
    @GeneratedValue
    private int id;
    private String firstName;
    private String email;
    private String mobile;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "member_id")
    private Member member;

    ----

    }

控制器:

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

表单有一个成员,对应的家庭列表(动态添加的字段),当我运行程序时,它保存了成员没有问题,它也保存了家庭列表,但 member_id 的值为空在家庭表中。

我在这里错过了什么?我感谢您的帮助。我正在学习 Spring MVC。

谢谢,

马迪斯。

**其他信息/问题**

按照 Alexander Staroselsky 的回答,我尝试了几个选项,但家庭表中的 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和spring mvc版本有关吗?有没有人遇到过这个问题?我使用的版本是:

<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>

谢谢,

感谢 Alexander,您抽出宝贵时间 - 非常感谢。更改为 @GeneratedValue(strategy = GenerationType.IDENTITY) 不起作用。将成员属性设置为 'nullable=false' 也不起作用,这个值实际上是给 null。插入sql语句如下:

Hibernate: 
    select
        member0_.member_id as member_i1_1_,
        member0_.email as email2_1_,
        member0_.firstname as firstnam3_1_,
        member0_.lastname as lastname4_1_,
        member0_.website as website5_1_ 
    from
        member member0_
Hibernate: 
    select
        next_val as id_val 
    from
        hibernate_sequence for update

Hibernate: 
    update
        hibernate_sequence 
    set
        next_val= ? 
    where
        next_val=?
Hibernate: 
    insert 
    into
        member
        (email, firstname, lastname, website, member_id) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        family
        (email, firstName, lastName, member_id, mobile) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        family
        (email, firstName, lastName, member_id, mobile) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    select
        member0_.member_id as member_i1_1_,
        member0_.email as email2_1_,
        member0_.firstname as firstnam3_1_,
        member0_.lastname as lastname4_1_,
        member0_.website as website5_1_ 
    from
        member member0_

sql 插入看起来很正常——除了family 表中的member_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 |
+------------------+-------------+

现在,问题似乎只出在 mappedBy 上(我可能错过了)。任何指针将不胜感激。 谢谢

【问题讨论】:

    标签: spring hibernate model-view-controller mapping many-to-one


    【解决方案1】:

    尝试将@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 添加到成员的@Column 参数中。我不认为这是一个休眠/春季版本问题。你能显示插入值的 SQL 吗?
    • 嗨,亚历山大,感谢您的留言。更改为这些也不起作用。我已经用 SQL 插入更新了我的问题。谢谢,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多