Java 重复输入';1-8';对于键';初级';

Java 重复输入';1-8';对于键';初级';,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我无法使用关系对象保存对象 这是来自数据库的简短屏幕截图 我已经在数据库中的几个品牌。我有很多SmartHFone作为JSON数据,我想把它推送到数据库中。这些智能手机都是类似的品牌 Smartphone smartphone = new Smartphone(); String deviceName = array.getJSONObject(i).getString("DeviceName"); smartphone.setName(deviceName); ... //other re

我无法使用关系对象保存对象

这是来自数据库的简短屏幕截图

我已经在数据库中的几个品牌。我有很多SmartHFone作为JSON数据,我想把它推送到数据库中。这些智能手机都是类似的品牌

Smartphone smartphone = new Smartphone();

String deviceName = array.getJSONObject(i).getString("DeviceName");
smartphone.setName(deviceName);
...
//other related objects
...
String brandValue = array.getJSONObject(i).getString("Brand");
Brand brand = brandService.findByName(brandValue);  // get brand from database by name
smartphone.setBrandId(brand);
smartphoneService.saveSmartphone(smartphone);
我从数据库中按名称获取品牌,并为智能手机设置品牌。在包含了smathpone所需的所有对象后,我保存了smartphone。我出错了
键“PRIMARY”的重复条目“1-8”
这与品牌相关,因为数据库中有8个品牌

我尝试将级联类型更改为persistent、ALL、RFRESH,我一直得到相同的结果

@Entity
public class Smartphone {
    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    @ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.REFRESH)
    @JoinColumn(name = "brand_id", referencedColumnName = "id", nullable = false)
    public Brand getBrandId() {
        return brandId;
    }

    public void setBrandId(Brand brandId) {
        this.brandId = brandId;
    }
}

@Entity
public class Brand {
    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToMany(mappedBy = "brandId")
    public Collection<Smartphone> getBrandId() {
        return brandId;
    }

    public void setBrandId(Collection<Smartphone> brandId) {
        this.brandId = brandId;
    }
}
@实体
公共级智能手机{
@身份证
@列(name=“id”)
公共int getId(){
返回id;
}
@manytone(fetch=FetchType.EAGER,cascade=CascadeType.REFRESH)
@JoinColumn(name=“brand\u id”,referencedColumnName=“id”,nullable=false)
公共品牌getBrandId(){
返回brandId;
}
公共品牌标识(品牌标识){
this.brandId=brandId;
}
}
@实体
大众品牌{
@身份证
@列(name=“id”)
公共int getId(){
返回id;
}
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy=“brandId”)
公共集合getBrandId(){
返回brandId;
}
公共标识(集合标识){
this.brandId=brandId;
}
}

您可以将主键映射附加到Hibernate上吗?我想知道哪些字段标记为
@Id
?已更新。但问题是,我的品牌已经在数据库中了。我用品牌表单数据库保存智能手机,hibernate想再次保存它。我认为这是一个问题。我应该使用级联类型,但我不知道是哪一种。您的brandService是否创建entitymanager,加载该实体,然后关闭entitymanager?如果是这样,那么smartphoneService将不得不做同样的事情-创建一个新的entitymanager-然后品牌实体不再连接到entitymanager,因此smartphoneService不知道它已经在数据库中。智能手机服务必须加载品牌实体,将其连接到手机,然后将手机持久化。@Jamie可能你是对的。branService有brandDao对象,其中有称为brandDao方法的对象。基本上,saveSmartphone和其他类似的保存方法使用getSession().persist(实体);保存对象。我认为这只是与级联类型设置有关。您能在Hibernate上附加主键映射吗?我想知道哪些字段标记为
@Id
?已更新。但问题是,我的品牌已经在数据库中了。我用品牌表单数据库保存智能手机,hibernate想再次保存它。我认为这是一个问题。我应该使用级联类型,但我不知道是哪一种。您的brandService是否创建entitymanager,加载该实体,然后关闭entitymanager?如果是这样,那么smartphoneService将不得不做同样的事情-创建一个新的entitymanager-然后品牌实体不再连接到entitymanager,因此smartphoneService不知道它已经在数据库中。智能手机服务必须加载品牌实体,将其连接到手机,然后将手机持久化。@Jamie可能你是对的。branService有brandDao对象,其中有称为brandDao方法的对象。基本上,saveSmartphone和其他类似的保存方法使用getSession().persist(实体);保存对象。我认为这只是与级联类型设置有关。