2014-11-05 2 views
0

У меня есть 2 отображения классов (аналог классов JPA):JAXB немаршалинг Сущности - Ссылки нулевые

AElement.java

@XmlType(propOrder = {"name", "children", }) 
@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class AElement implements Serializable { 

private String name; 
private List<BElement> children; 

@XmlElement(name = "metadatum") 
public List<BElement> getChildren(){ 
    return children; 
} 

... 
} 

BElement.java

@XmlRootElement(name = "b") 
@XmlType(propOrder = {"name"}) 
public class BElement implements Serializable{ 

private String name; 
private AElement parent; 

... 
} 

и B находятся в соотношении OneToMany. XML должен выглядеть следующим образом:

<A> 
    <B></B> 
    <B></B> 
</A> 

Если я распаковать XML-сопоставьте его к моим классам JPA и сохраняется это к моим всем базам данных хранятся правильно кроме моих ссылок. Это означает, что B хранится без внешнего ключа до A в базе данных.

Я использую JPA с Hibernate. После моих JPA классы:

A.java

@Entity 
public class A implements Serializable { 


@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long id; 

@Column 
private String name; 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "parent") 
private List<B> children; 

public List<B> getChildren(){ 
    return children; 
} 

... 
} 

B.java

@Entity 
public class B implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long id; 

@Column 
private String name; 

@ManyToOne(optional = true) 
@JoinColumn(name = "a_id", referencedColumnName = "id") 
private A parent; 

... 
} 
+0

Я думаю, что вы должны добавить больше информации о настойчивости, кажется, вопрос JPA. – Xstian

+0

Добавлены классы jpa. – p4tm4n

+0

Вы уверены, что существуют В таблице B столбец 'a_id'? В любом случае для '@ ManyToOne'' optional = true' не требуется, потому что это значение по умолчанию, и вы также можете удалить 'referencedColumnName = "id" 'on JoinColumn. – Xstian

ответ

0

Похоже, я должен назначить соответствующую А каждому В. Это решает мою проблему ,

a.getB().forEach(b -> b.setA(a)); 

Я не знаю, если это хороший способ обхода? Тем более, что у меня есть другие объекты, которые являются дочерними пользователями B.

+0

Не обходной путь, а правильный способ сохранения двунаправленных отношений. Как я сказал выше в предыдущем комментарии. Дозер не установил отношения в обеих сторонах. – Xstian

+0

В любом случае действительно нужна двунаправленность всех ваших отношений? .. Если вы удалите его (например, @ManyToOne из B), все работает нормально (без решения выше). – Xstian

+0

Да, мне нужны они двунаправленные. Есть ли способ сопоставить двунаправленную с DOZER? – p4tm4n

0

Найдено решение:

Метод afterUnmarshal в классе BElement.java

public void afterUnmarshal(Unmarshaller u, Object parent) { 
    this.a = (AElement)parent; 
} 
Смежные вопросы