Промежуточная таблица с EmbeddedId вызывает StackOverflow - PullRequest
0 голосов
/ 18 января 2010

У меня проблема с отображением в спящем режиме с помощью EmbeddedId. Мой код выглядит так:

Inventory:

public class Inventory {

private Long id;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "inventory_id")
public Long getId() {
    return id;
}

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

private Set<InventoryUser> inventoryUser = new HashSet<InventoryUser>();

@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER, mappedBy = "pk.inventory")
public Set<InventoryUser> getInventoryUser() {
    return inventoryUser;
}

public void setInventoryUser(Set<InventoryUser> productUser) {
    this.inventoryUser = productUser;
}
}

Пользователь:

@Entity
@Table(name = "User_Table")
public class User implements Comparable{
private String id;

@Id
@Column(name = "user_id")
public String getId() {
    return id;
}

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

private Set<InventoryUser> inventoryUser = new LinkedHashSet<InventoryUser>();

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user")
public Set<InventoryUser> getInventoryUser() {
    return inventoryUser;
}

public void setInventoryUser(Set<InventoryUser> inventoryUser) {
    this.inventoryUser = inventoryUser;
}

InventoryUser

@Entity
@Table(name = "Inventory_User")
public class InventoryUser {    
private ProductUserPK pk = new ProductUserPK();

@EmbeddedId
@NotNull
public ProductUserPK getPk() {
    return pk;
}

public void setPk(ProductUserPK pk) {
    this.pk = pk;
}

@Embeddable
public static class ProductUserPK implements Serializable {
    public ProductUserPK(){

    }

    private User user;

    @ManyToOne
    @JoinColumn(name = "user_id", insertable = false, nullable = false)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
        // this.user.getInventoryUser().add(InventoryUser.this);

    }

    private Inventory inventory;

    @ManyToOne
    @JoinColumn(name = "inventory_id", insertable = false, nullable = false)
    public Inventory getInventory() {
        return inventory;
    }

    public void setInventory(Inventory inventory) {
        this.inventory = inventory;

    }

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

Есть идеи, о чем это?

Greets Chris

Ответы [ 3 ]

0 голосов
/ 18 января 2010

Я думаю, что это из-за циклической ссылки между InventoryUser и ProductUserPK.

Либо InventoryUser.pk, либо ProductUserPK.user должны быть ленивыми.

0 голосов
/ 18 января 2010

Хммм, похоже, это как-то связано с поиском по критерию.Я попробовал простой hql statment и я работал ... Спасибо за ответ, я поставил меня на правильный путь;)

0 голосов
/ 18 января 2010

Принимая удар без дополнительных подробностей ... похоже, ваш объект Inventory охотно выбирает InventoryUser, который содержит первичный ключ ProductUser, который содержит Inventory. Это округло и, вероятно, вызывает переполнение.

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