Мне нужна помощь по Spring MVC 4 и hibernate 5 (как последняя версия, так и сейчас).Spring MVC Hibernate Многие к одному дают нулевое значение для внешнего ключа
У меня есть два класса - член и семья. Член (штат) может иметь несколько членов семьи, которые Я хотел бы иметь отношение «много-к-одному» к семейному классу.
Snapp выстрел класса пользователя:
@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;
.....
}
Снимок из семейного класса:
@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;
}`
Форма имеет один член со списком соответствующих семьи (поля добавляются динамически), и когда я запускаю программу, она сохраняет участника без проблем, d также сохраняет список семейств, но с нулевым значением для member_id в таблице семейства.
что я пропустил? Я ценю вашу помощь. Я изучаю Spring MVC.
Thanks,
Maadis.
** Дополнительная информация/вопрос **
После ответа Александра Старосельский, я попробовал несколько вариантов, но 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>
Спасибо,
Спасибо, Александр, за ваше время - по-настоящему оценили. Переход на @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 вставка выглядит нормально - все остальные значения есть, кроме member_id в таблице семейства.
вставленные значения испытаний на обеих таблицах:
mysql> select * from member;
+-----------+----------------+-----------+----------+---------+
| member_id | email | firstname | lastname | website |
+-----------+----------------+-----------+----------+---------+
| 1 | [email protected] | firstname | lastname | dot.com |
+-----------+----------------+-----------+----------+---------+
1 row in set (0.00 sec)
mysql> select * from family;
+----+----------------+-----------+----------+--------+-----------+
| id | email | firstName | lastName | mobile | member_id |
+----+----------------+-----------+----------+--------+-----------+
| 1 | [email protected] | test1 | test` | i3i3 | NULL |
| 2 | [email protected] | test2 | test2 | 7373 | NULL |
+----+----------------+-----------+----------+--------+-----------+
2 rows in set (0.00 sec)
Благодарности
еще одно тестирование
Я просто удалил mappedBy = «элемент», чтобы проверить, работает ли он в отдельной таблице. Он отлично работает. Как и ожидалось, он создал третью таблицу - member_family - и правильно вставил значения id.Ниже приведены тестовые значения:
mysql> select * from member;
+-----------+----------------+-----------+----------+---------+
| member_id | email | firstname | lastname | website |
+-----------+----------------+-----------+----------+---------+
| 1 | [email protected] | tre | jjj | dot.com |
+-----------+----------------+-----------+----------+---------+
1 row in set (0.00 sec)
mysql> select * from family;
+----+-----------------+-----------+----------+----------+-----------+
| id | email | firstName | lastName | mobile | member_id |
+----+-----------------+-----------+----------+----------+-----------+
| 1 | [email protected] | test | teke | d8i38303 | NULL |
| 2 | [email protected] | 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 (то, что я, возможно, пропустили) только. Любые указатели будут высоко оценены. Благодаря
Спасибо, Александр, за ваш ответ. @GeneratedValue (GenerationType.AUTO) предоставил автогенерированные значения для первичных ключей члена и семейства, но столбец member_id в таблице семейства по-прежнему равен null (вместо значения memberId. Что-нибудь еще я могу попробовать здесь? Спасибо, – Maadis
Попробуйте 'GenerationType. Identity' (javax.persistence.GenerationType.IDENTITY) вместо 'GenerationType.AUTO'. Также попробуйте добавить' unique = true, nullable = false' к параметрам '@ Column' элемента. Я не думаю, что это спящий режим/spring version. Можете ли вы показать SQL для вставок значений? –
Привет, Александр, Спасибо за ваше сообщение. Изменение на них не сработало. Я обновил свой вопрос с помощью SQL-вставки. Спасибо, – Maadis