无法将对象添加到集合中

问题描述 投票:0回答:2

嗨,我在java中有一个小问题,我没有错误,但我没有得到我想要的。在这里,我创建了 3 个披萨,我想将它们放入一组,问题是当我打印我的组时,我只有一个披萨,这是第一个 p1。

这是代码:

Pizza p1 = new Pizza(cannibale, Taille.Large, TypePate.Classique);
Pizza p2 = new Pizza(forestiere, Taille.XL, TypePate.Fine);
Pizza p3 = new Pizza(hypnotika, Taille.Medium, TypePate.MozzaCrust);

Set<Pizza> pizzas = new HashSet<Pizza>();

Collections.addAll(pizzas, p1,p2,p3);   

披萨

    @Entity
    @Table(name = "pizza")
    @SequenceGenerator(name = "seqPizza", sequenceName = "seq_pizza", initialValue = 1, allocationSize = 1)

    public class Pizza {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqPizza")
    @Column(name = "id")
private Long id;

@ManyToOne
@JoinColumn(name = "recette", foreignKey = @ForeignKey(name = "PIZZA_RECETTE_ID_FK"))
private Recette recette;

@ManyToOne
@JoinColumn(name = "numticket_id", foreignKey = @ForeignKey(name = "PIZZA_NUMTICKET_ID_FK"))
private Commande commandePizza;

@Column(name = "prix")
private double prix;

@Enumerated(EnumType.STRING)
@Column(name = "taille_pizza")
private Taille taille;

@Enumerated(EnumType.STRING)
@Column(name = "type_pate")
private TypePate pate;

public Pizza() {
}

public Pizza(Recette recette, Taille taille, TypePate pate) {

    this.recette = recette;
    this.taille = taille;
    this.pate = pate;

    if (taille == Taille.Medium) {
        this.prix = recette.getPrixM();
    } else if (taille == Taille.Large) {
        this.prix = recette.getPrixL();
    } else {
        this.prix = recette.getPrixXL();
    }

    if (pate == TypePate.MozzaCrust) {
        this.prix = this.prix + pate.getPrix();
    } else if (pate == TypePate.Pan) {
        this.prix = this.prix + pate.getPrix();
    } else {
        this.prix = this.prix + pate.getPrix();
    }

}

public Long getId() {
    return id;
}

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

public Commande getCommandePizza() {
    return commandePizza;
}

public void setCommandePizza(Commande commandePizza) {
    this.commandePizza = commandePizza;
}

public double getPrix() {
    return prix;
}

public void setPrix(double prix) {
    this.prix = prix;
}

public Recette getRecette() {
    return recette;
}

public void setRecette(Recette recette) {
    this.recette = recette;
}

public Taille getTaille() {
    return taille;
}

public void setTaille(Taille taille) {
    this.taille = taille;
}

public TypePate getPate() {
    return pate;
}

public void setPate(TypePate pate) {
    this.pate = pate;
}

@Override
public int hashCode() {
    return Objects.hash(id);
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Pizza other = (Pizza) obj;
    return Objects.equals(id, other.id);
}

您可以在这里找到所有代码:https://github.com/HamzaMerini/help/tree/main/pizzayolo

谢谢!!

java collections set addition hashset
2个回答
1
投票

即使你的类用

Entity
注解,当你手动实例化对象时,它也不会以类似的方式工作;即,在将
Pizza
持久保存到数据库时,您可能会看到由于
id
,新的
insert / save
被分配给每个
@SequenceGenerator
调用。

但是当您手动实例化

Pizza
并尝试将其插入到
HashSet
时,它会根据
Pizza
检查是否有任何预先存在的
hashCode
可用。手动实例化会将默认值
0
分配给
id
,因此只有第一次插入到
HashSet
才会成功。

更改

hashCode
,使其产生一些独特的价值,这样
Collections.addAll
就会发挥作用。


1
投票

HashSet 使用

hashCode
(当相等时也使用
equals
)来计算身份。你们的披萨似乎有相同的 ID。因此,对于所有三个比萨饼,您既不在构造函数中提供一个,也不设置一个,它保持为空。您可以保留所有这些并让数据库提供 id,或者自己设置它们。

当你使用Java 9以上时,你可以使用实用方法:


Set<Pizza> pizzas = java.util.Set.of(p1, p2, p3);

对于旧版本,您可以使用:


Set<Pizza> pizzas = new HashSet<>;
pizzas.add(p1);
pizzas.add(p2);
pizzas.add(p3);
© www.soinside.com 2019 - 2024. All rights reserved.