嗨,我在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
谢谢!!
即使你的类用
Entity
注解,当你手动实例化对象时,它也不会以类似的方式工作;即,在将 Pizza
持久保存到数据库时,您可能会看到由于 id
,新的 insert / save
被分配给每个 @SequenceGenerator
调用。
但是当您手动实例化
Pizza
并尝试将其插入到 HashSet
时,它会根据 Pizza
检查是否有任何预先存在的 hashCode
可用。手动实例化会将默认值 0
分配给 id
,因此只有第一次插入到 HashSet
才会成功。
更改
hashCode
,使其产生一些独特的价值,这样Collections.addAll
就会发挥作用。
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);