EXSolo
EXSolo

Reputation: 90

java - Hibernate doesn't read object from database correctly

I am having some issues according Hibernate.

I have a more or less complex object structure that I want to save / load using the Hibernate EntityManager (version 4.3.5.Final). I managed to save it, but if I attempt to read the obejct, only the PK will be read. The EntityManager's find method returns null even with the correct PK so I am using its getReference method.

I still have troubles using the correct relationship (ManyToOne and such) so I most likely made a mistake there and I guess that is causing the problem. Anyways.

My question is: How do i persist an object structure like this using Hibernate?

Here are the POJOs i am using:

EDIT: Updated the Code

CalculationList:

@Entity(name = "calculation")
public class CalculationList implements EntityList {

@Id
private Date created;

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

public CalculationList(Date created) {
    this.created = created;
    this.products = new LinkedList<>();
}

public CalculationList(Date created, List<Product> products) {
    this.created = created;
    this.products = products;
}

public CalculationList() {
}

public Date getCreated() {
    return created;
}

public void setCreated(Date created) {
    this.created = created;
}

public List<Product> getProducts() {
    return products;
}

public void setProducts(List<Product> entities) {
    this.products = entities;
}

@Override
public String toString() {
    return "CalculationList{" +
            "created=" + created +
            ", products=" + products +
            '}';
}
}

CalulatorEntity:

@Entity(name = "calculator_entity")
public class CalculatorEntity implements Serializable {

@Id
private int id;

private CalculatorEntityType type;

private String name;

private int number;

@ManyToOne(cascade = CascadeType.ALL)
private Product product;

public CalculatorEntity(CalculatorEntityType type) {
    this.type = type;
}

protected CalculatorEntity() {
}

public int getNumber() {
    return number;
}

public void setNumber(int number) {
    this.number = number;
}

public Product getProduct() {
    return product;
}

public void setProduct(Product product) {
    this.product = product;
}

public int getId() {
    return id;
}

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

public CalculatorEntityType getType() {
    return type;
}

public void setType(CalculatorEntityType type) {
    this.type = type;
}

public String getName() {
    return name;
}

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

public enum CalculatorEntityType {
    GAS_PUMP, DELIVERY_BILL;
}

@Override
public String toString() {
    return "CalculatorEntity{" +
            "id=" + id +
            ", type=" + type +
            ", name='" + name + '\'' +
            ", product=" + product +
            ", number=" + number +
            '}';
}
}

Product:

@Entity(name = "product")
public class Product implements Serializable {

@Id
private int id;

private String name;

private ProductType type;

@OneToMany(mappedBy = "product", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<CalculatorEntity> entities;

public Product(String name, ProductType type) {
    this.name = name;
    this.type = type;
    this.entities = new LinkedList<>();
}

/**
 * JPA - Konstruktor
 */
public Product() {
}

public int getId() {
    return id;
}

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

public String getName() {
    return name;
}

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

public ProductType getType() {
    return type;
}

public void setType(ProductType type) {
    this.type = type;
}

public List<CalculatorEntity> getEntities() {
    return entities;
}

public void setEntities(List<CalculatorEntity> entities) {
    this.entities = entities;
}

@Override
public String toString() {
    return "Product{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", type=" + type +
            ", entities=" + entities +
            '}';
}

public enum ProductType {

    FUEL("Treibstoff"), OIL("Öl"), OTHER("Verschiedenes");

    private String name;

    private ProductType(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}
}

Upvotes: 1

Views: 210

Answers (1)

cнŝdk
cнŝdk

Reputation: 32145

You are using the @OneToMany mapping with the wrong entity, instead of mapping Product class you are mapping CalculationList class, move the following configuration:

@OneToMany(mappedBy = "product", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<CalculatorEntity> entities;

to the Product class.

Upvotes: 1

Related Questions