2017-01-16 18 views
0

Мне нужна помощь по 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 (то, что я, возможно, пропустили) только. Любые указатели будут высоко оценены. Благодаря

ответ

0

Попробуйте заменить @GeneratedValue с @GeneratedValue(strategy = GenerationType.AUTO) обеспечить идентификатор генерируется для каждого объекта:

... 
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; 
... 
+0

Спасибо, Александр, за ваш ответ. @GeneratedValue (GenerationType.AUTO) предоставил автогенерированные значения для первичных ключей члена и семейства, но столбец member_id в таблице семейства по-прежнему равен null (вместо значения memberId. Что-нибудь еще я могу попробовать здесь? Спасибо, – Maadis

+0

Попробуйте 'GenerationType. Identity' (javax.persistence.GenerationType.IDENTITY) вместо 'GenerationType.AUTO'. Также попробуйте добавить' unique = true, nullable = false' к параметрам '@ Column' элемента. Я не думаю, что это спящий режим/spring version. Можете ли вы показать SQL для вставок значений? –

+0

Привет, Александр, Спасибо за ваше сообщение. Изменение на них не сработало. Я обновил свой вопрос с помощью SQL-вставки. Спасибо, – Maadis

 Смежные вопросы

  • Нет связанных вопросов^_^