2013-03-08 2 views
8

У меня есть 2 классов, называемых PurchaseList.java и PurchaseListItems.javaHibernate OnetoMany, ManyToOne Mapping Предоставление нулевой

Я должен отобразить PurchaseList в PurchaseListItems

PurchaseList.java

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="pl_id",referencedColumnName="id") 
private List<PurchaseListItems> purchaseListItems; 

PurchaseListItems.java

@ManyToOne 
@JoinColumn(name="pl_id") 
private PurchaseList purchaseListId; 

Все в порядке, но я получаю null в pl_id. Пожалуйста, сообщите, где я ошибаюсь.

+0

JPA не управляет двунаправленными отношениями. Вы должны установить обратное отношение самостоятельно. Также обратите внимание, что ваши отображения определяют два независимых однонаправленных отношения. Смотрите мое объяснение ниже – bennidi

ответ

5

Ваше отображение фактически определяет два независимых однонаправленных отношения. То, что вы хотите, это один двунаправленный relation.The следующий код будет установить двунаправленную связь

@OneToMany(cascade = CascadeType.ALL, mappedBy = "purchaseListId") 
@JoinColumn(name="pl_id",referencedColumnName="id") 
private List<PurchaseListItems> purchaseListItems; 

Атрибут mappedBy необходимо, так как нет никакого способа для поставщика, чтобы определить, что указанные отношения фактически образуют единое отношение. Можно использовать Java-тип члена экземпляра, но тогда, если у вас несколько членов одного типа. И есть много сценариев, где у вас есть два отдельных отношения. Пример:

OneToMany: Пользователь -> ForumThread (нити, созданные пользователем)

ManyToOne: ForumThread -> User (. Пользователь, который закрыл нить, очевидно, не обязательно тот, кто начал нить)

Это два независимых отношения и должны рассматриваться как таковые. Вы были бы удивлены, если бы ваша настойчивость обеспечила просто двунаправленное отношение из этого только потому, что типы и множественность совпадали.

Также обратите внимание, что двунаправленные отношения автоматически не управляются каким-либо поставщиком JPA, а это означает, что обратная сторона автоматически не обновляется/не устанавливается в вашей объектной модели и, следовательно, не находится в db. Вы должны сделать это сами. Кстати, во всех моих проектах двунаправленные отношения были болью в заднице, и я думаю, что желательно избегать их.

+6

С hibernate4 (не уверен в предыдущей версии) mappedby и JoinColumn cannont будут использоваться вместе. – Chandru

+0

У меня такой же опыт, как https://stackoverflow.com/users/1047493/bennidi. Если я избегу двунаправленных отношений и выберу все «вручную». Я закончил два раза быстрее. – hariprasad

0

Спецификация jpa выглядит хорошо, но убедитесь, что вы дали действительные родительские отношения с дочерними элементами в базе данных. Если ссылка не указана, она вернет значение null.

0

попробовать этот

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId") 
0

Проверьте, если вы заселены purchaseListId с действительным значением (сотворенный PurchaseList экземпляра) при создании значения в PurchaseListItems.

Это лучше использовать mappedBy как ниже код, чтобы позволить много-сторону maintian отношения.

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId") 
@JoinColumn(name="pl_id",referencedColumnName="id") 
private List<PurchaseListItems> purchaseListItems; 
+0

Нет, его не работает Генри, что вы сказали выше. Мне не хватает чего-то, чего я не знаю. –

+0

@sainath Можете ли вы объяснить, что вы подразумеваете под «Все в порядке, но я получаю null в pl_id»? вы имеете в виду, что pl_id имеет значение null в базе данных или в загруженном экземпляре PurchaseListItems? –

+0

В базе данных на момент вставки она должна взять идентификатор из Закупок, и она должна быть вставлена ​​вместо идентификатора pl. Но вместо этого он сохраняет значение null. –

0
for(PurchaseListItems item:purchaseListItemsList) 
item.purchaseListId(PurchaseList); 

Это то, что я пропустил, когда я создаю объект.

Thnaks за ответы

0
  1. @JoinColumn аннотацию принадлежит на @ManyToOne стороне отношений - но не на стороне @OneToMany - удалить его из стороны @OneToMany.

  2. Каскад используется для каскадирования операций DELETE/READ/UPDATE ..., но он автоматически не заполняет столбец идентификатора на стороне «ребенка» внешнего ключа. Фактически, он не заполняет ссылки java объектам с обеих сторон отношений FK. Вам необходимо вручную установить данные отношений с обеих сторон двунаправленных отношений:

    myPurchaseListItem.setPurchaseList (myPurchaseList);
    myPurchaseList.setPurchaseListItem (myPurchaseListItem);

    Из JPA 2 спецификации:

    двунаправленного отношения между управляемыми объектами будет сохранено на основе ссылок, принадлежащих владеющей сторона отношений. Ответственность разработчика заключается в том, чтобы сохранить в памяти ссылки, хранящиеся на стороне владельца, и те, которые находятся на обратной стороне, согласованы друг с другом, когда они меняются. В случае однонаправленных отношений «один к одному» и «один ко многим» ответственность разработчика заключается в том, чтобы гарантировать (sic), что соблюдается семантика отношений.[29]

    Особенно важно обеспечить, чтобы изменения в обратной стороне отношений приводили к соответствующим обновлениям на стороне владельца, чтобы гарантировать, что изменения не будут потеряны при синхронизации с базой данных.

1

По какой-то причине, отображенной на не работал для меня с Postgres SQL и Hibernate4

Ниже картографирования работал

PurchaseList.java

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="pl_id",nullable=false) 
private List<PurchaseListItems> purchaseListItems; 

PurchaseListItems.java

@ManyToOne 
@JoinColumn(name="pl_id", nullable=false,insertable=false,updatable=false) 
private PurchaseList purchaseListId; 

Примечание: вы должны использовать Identity или Явно упомянуть столбцы Sequence для id для postgres.

@GeneratedValue(strategy=GenerationType.IDENTITY) 
+0

Внутри таблицы значение столбца соединения обновляется, но в объекте объекта я также получаю значение как null –

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