当前位置: 首页 > 知识库问答 >
问题:

在数据库中插入实体+外键的正确方法(使用:Mysql,JPA)

关玮
2023-03-14

我有一个问题,关于正确的方法,使插入我的实体+外键在数据库(Mysql,jpa)。在问我的问题之前,我尝试了我找到的解决方法,我花了几天时间自己解决这个问题。我好像有什么不对劲:

我需要做的是:
1。站点表中已经存在数据(信息)
2。我必须在序列表中插入新序列
3。我必须在序列表中插入新序列,并关联FK站点的(站点已存在,不需要再次插入)

主要问题是:
1。当我插入序列表时,我有正确插入站点FK的序列
。但是!问题是我在数据库中也有站点插入,所以在插入序列数据时站点的冗余插入

我只需要插入一个有关联的序列(站点的FK)。

下面是我的控制台上发生的情况:

Hibernate: insert into Sites (Current_Sequence, Date_Insert, Date_Update, Enable, Nom_Site, User_Update, applicationService_Id_SA, partner_Id_Partner, Id_Site) values (?, ?, ?, ?, ?, ?, ?, ?, ?)

Hibernate: insert into Sequences (Date_Insert_timestamp, Date_Update_timestamp, Nbr_PDF, Nbr_ZPL, Size_PDF, Size_ZPL, TimestampMinute, User_Update, site_Id_Site, status, Id_Sequence) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Sites_Sequences (Site_Id_Site, sequences_Id_Sequence) values (?, ?)



Jpa存储库:我首先按名称获取站点对象


    @Override
        public Site findSiteByName(String Name_Site) {
            List sites = entityManager.createQuery("SELECT s FROM Site s").getResultList();
            for (Site item : sites) {
                if (item.getNom_Site().equals(Name_Site)) {
                    return item;
                }
            }

            return null;
        }


Jpa方法在数据库中插入序列


    @Override
        public Sequence saveSequence(Sequence sequence) {

            return super.save(sequence);
        }


我的Rest控制器:


    @GET
    @Path("/addSeq")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Sequence addSeq(@Context final UriInfo uriInfo) {
        Site site = siteService.findSiteByName("Name_Site");
        Sequence sequence = sequenceFactory.CreateSequence(new Date(), new Date(), "", "", "", 4, 6, 10, 12);
        sequence.setSite(site);
        site.getSequences().add(sequence);
        sequenceservice.saveSequence(sequence);
        return null;
    }


我的主要类是:


    @Entity
    @Table(name = "Sequences")
    public class Sequence {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id_Sequence", unique = true, nullable = false)
    private long Id_Sequence;
    private Date ....;
    private Date ....;
    private String ....;
    private String ....;
    private String ....;
    private int ....;
    private int ....;
    private double ....;
    private double ....;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set traceSequences = new HashSet();
    @ManyToOne(cascade = CascadeType.ALL)
    private Site site;

    public constructor...

    public set..
    public get..




 @Entity
    @Table(name = "Sites")
    public class Site  {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id_Site", unique = true, nullable = false)
    private long Id_Site;
    private String ...;
    private boolean ...;
    private long ...; 
    private Date ...;
    private Date ...;
    private String ...;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set sequences = new HashSet();

    @ManyToOne
    private ... ...;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set ... = new HashSet();

    @ManyToOne
    private ... ...;

    public constructor...

    public set..
    public get..

共有1个答案

印飞捷
2023-03-14

可以尝试删除所有关系中的cascade=cascadeType.all吗?我认为主要问题是cascadetype.persist被级联到子元素。您可以在这里看到JPA with JTA:Persist entity and merge cascaded child entities

我建议的另一件事是将您的表数从3减少到2。因为您使用的是OneTomany-关系,它不需要像现在这样的映射表。为此,在ManyToOne站点上的OneToMany-annotation和一个附加的JoinColumn-annotation中使用了mappedBy-clause。

@Entity
@Table(name = "Sites")
public class Site {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id_Site", unique = true, nullable = false)
    private long Id_Site;
    private String ...;
    private boolean ...;
    private long ...; 
    private Date ...;
    private Date ...;
    private String ...;

    @OneToMany(mappedBy="site", fetch = FetchType.EAGER)
    private Set<Sequence> sequences = new HashSet<>();


@Entity
@Table(name = "Sequences")
public class Sequence {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id_Sequence", unique = true, nullable = false)
    private long Id_Sequence;
    private Date ....;
    private Date ....;
    private String ....;
    private String ....;
    private String ....;
    private int ....;
    private int ....;
    private double ....;
    private double ....;

    @OneToMany(fetch = FetchType.EAGER)
    private Set<Sequence> traceSequences = new HashSet<>();

    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "site_Id_Site", nullable = false)
    private Site site;

编辑我尝试使用:

public interface SequenceRepository extends JpaRepository<Sequence, Long> {

}

而且

Site site = siteRepository.findOne(1L);

Sequence seq = new Sequence();
seq.setSite(site);
site.getSequences().add(seq);

sequenceRepository.save(seq);

带来

Hibernate: select site0_.id_site...
Hibernate: insert into sequences (site_id_site) values (?)

在类路径中,我有spring-data-rest-webmvc-2.5.6.release.jar

 类似资料:
  • 我做了2个表第二个表由外键组成,它引用了第一个表的主键第二个表由3个字段组成id(主键),顺序号,fid我使用以下命令 sql语法中的错误

  • 我是mysql和php的初学者。在这个问题上陷入了困境。不知道问题出在哪里。但是如果我直接执行insert查询,它就会被执行,而如果我从用户那里接受它,它就不会被执行(代码中显示了这一点)。可能问题出在我用来检索用户提交的值的$\u POST[]方法上。我已经提交了两个代码,addbooks。php(用户提交值的表单)和add。php(插入数据库)。

  • 我正在尝试在table of数据库与table of数据库之间创建外键: 用户id int(10)未签名的编号 Id int(10)无符号编号 我创建了查询 "外键约束格式错误"有人能帮助我如何实现这一点吗?

  • 我正在尝试使用Java jdbc连接在mysql数据库中插入一行。。。。 这是我的密码, } 当我尝试运行代码时,我得到类强制转换异常。。。非常感谢您的帮助。这是我的学生。java类 } 当我运行代码时,我得到以下错误:线程“main”java中出现异常。lang.ClassCastException:类java。util。日期不能转换为java类。sql。jdbcsample中的日期(java.

  • 问题内容: 我试图将图像存储在数据库中,由于某种原因,它似乎无法正常工作。这是我桌子的结构。 这是我的查询,它插入图像或至少多数民众赞成在什么: 如果我打印file_get_contents($ tmp_image)的值,那么屏幕上会有大量数据。但是,此值不会存储在数据库中,这就是我面临的问题。 问题答案: 问题 这会在PHP中创建一个名为的字符串。暂时不要使用MySQL,因为您尚未执行任何查询。

  • 本文向大家介绍Python实现生成随机数据插入mysql数据库的方法,包括了Python实现生成随机数据插入mysql数据库的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现生成随机数据插入mysql数据库的方法。分享给大家供大家参考,具体如下: 运行结果: 实现代码: 可见数据库中插入的数据有随机用户名及其对应密码。 PS:这里再为大家推荐一款功能相似的在线工具供大家