Вставка нулевого значения во внешний ключ при сохранении родительской таблицы с использованием спящего режима - PullRequest
0 голосов
/ 12 ноября 2018

Я пытался сохранить таблицу, используя Hibernate.Родительская таблица имеет отношение «один ко многим» со своей дочерней таблицей.Родительская таблица POJO имеет коллекцию дочерних таблиц POJO.

Когда я сохраняю родительскую таблицу, данные также вставляются в дочернюю таблицу, но без внешнего ключа в виде NULL.

Ниже приведен мой код: Родитель:

public class Parent implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 45)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "parentid", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
private Collection<Child> childCollection;

public Parent() {
}

public Parent(Integer id) {
    this.id = id;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@XmlTransient
public Collection<Child> getChildCollection() {
    return childCollection;
}

public void setChildCollection(Collection<Child> childCollection) {
    this.childCollection = childCollection;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Parent)) {
        return false;
    }
    Parent other = (Parent) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "beans.Parent[ id=" + id + " ]";
}
}

Ребенок:

public class Child implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 45)
@Column(name = "comments")
private String comments;
@JoinColumn(name = "parentid", referencedColumnName = "id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Parent parentid;

public Child() {
}

public Child(Integer id) {
    this.id = id;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getComments() {
    return comments;
}

public void setComments(String comments) {
    this.comments = comments;
}

public Parent getParentid() {
    return parentid;
}

public void setParentid(Parent parentid) {
    this.parentid = parentid;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Child)) {
        return false;
    }
    Child other = (Child) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "beans.Child[ id=" + id + " ]";
} }

Сервис гибернации:

public class HibernateSave {
public static void main(String[] args) {
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

    Session session = sessionFactory.openSession();

            Transaction tx1 = session.beginTransaction();

    Parent parent = new Parent();
            Child child1 = new Child();
            parent.setName("Name");
            child1.setComments("Hey");
            //child1.setParentid(parent);
            List<Child> childs = new ArrayList<Child>();
            childs.add(child1);


            parent.setChildCollection(childs);

            System.out.println("parent Saved id="+session.save(parent));
            tx1.commit();
    session.flush(); //address will not get saved without this
    System.out.println("*****");



} }

Я нашел решение, в котором я поменял местами моего ребенкародитель, как показано ниже

child1.setParentid(parent);

Но я думаю, можно ли этого избежать.Я надеюсь, что есть какой-то другой путь, когда мне не нужно будет привязывать каждого моего ребенка к его родителю.

Помощь Kinldy, а также, если вы могли бы объяснить.

1 Ответ

0 голосов
/ 12 ноября 2018

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

Одна вещь, которую вы могли бы сделать, это создать метод в Parent для добавления Childs:

public void addChild(Child child) {
    childCollection.add(child);
    child.setParentId(this);
}

или / и наоборот в Child:

public void setParent(Parent parent) {
    parent.getChildCollection().add(this);
    this.setParentId(parent)
}

(код без необходимых нулевых проверок и т. Д., Но должен дать представление)

и, таким образом, делает код немного менее подверженным ошибкам (т. Е. Забывает обновить другую сторону отношений).

Кажется также, что есть Bytecode-Enhancement, который добавит подобный код к файлам классов ваших сущностей, но я не знаю, насколько хорошо это работает (подробности см. здесь )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...