【发布时间】: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