代码之家  ›  专栏  ›  技术社区  ›  robert trudel

非休眠保存的外键

  •  2
  • robert trudel  · 技术社区  · 7 年前

    在带有Hibernate和JPA的SpringBoot2项目中,

    我试图保存一些对象

    @Embeddable
    public class EmbedddedSamplesKey implements Serializable {
    
        private Integer id;
        private int year;
        ...
    }
    
    @Entity
    @IdClass(EmbedddedSamplesKey.class)
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public class Samplings {
    
        @Id
        @GeneratedValue
        private Integer id;
    
        @Id
        private int year;
    
        @OneToMany(mappedBy = "sampling", cascade = CascadeType.PERSIST, orphanRemoval = true)
        private List<Samples> samples = new ArrayList<>();
    
        public void addSample(Samples sample) {
          samples.add(sample);
          sample.setSampling(this);
        }
    
        public void removeSample(Samples sample) {
          samples.remove(sample);
          sample.setSampling(null);
        }
    
        ...
    }
    
    @Entity
    public class Samples extends BaseEntity {
        @Id
        @SequenceGenerator(name = "samples_id_seq", sequenceName = "samples_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "samples_id_seq")
        private Integer id;
    
        private String letter;
    
        //@OneToOne(optional = false, cascade = CascadeType.PERSIST)
        //private TestSamples testSamples;
    
        @ManyToOne
        private Samplings sampling;
        ...
    }
    

    当我保存采样时,我会在采样表中看到

    采样ID 取样年份

    不是饲料

    这应该是ORM的工作吗?

    在示例中,ORM已生成此

    ALTER TABLE samples
      ADD CONSTRAINT fkq5if151jgtlcy7yfp55ffvf47 FOREIGN KEY (sampling_id, sampling_year)
      REFERENCES samplings (id, year)
      ON UPDATE NO ACTION
      ON DELETE NO ACTION;
    

    编辑,尝试

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "sampling_id", referencedColumnName = "id"),
        @JoinColumn(name = "sampling_year", referencedColumnName = "year")})
    private Samplings sampling;
    

    但同样的结果

    另外,如果在样本中我想使用像sampling primary+field letter一样的primary key,有没有办法做到这一点?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Marc Collin    7 年前

    可能和尼古拉斯说的相反

    只需检查这个例子

    https://github.com/hibernate/hibernate-orm/blob/ceaeb81e3362ff187004ea3479b2afeeba5aa8a6/documentation/src/test/java/org/hibernate/userguide/mapping/identifier/IdClassGeneratedValueTest.java#L77

    改成Cascade.all,应该有帮助…可能是将数据冲刺到合并而不是持久化。

    可能是弹簧靴问题?

        2
  •  0
  •   Roberto Rodriguez    7 年前

    我认为您缺少@joincolumn注释:

    @ManyToOne
    @JoinColumn(name = "sampling")
    private Samplings sampling;
    
        3
  •  0
  •   Yvan Dupré    7 年前

    也许不是最好的答案,但最好等3个月再得到答案……时间就是金钱。

    如果不知道需要对序列进行任何特殊操作…

    只需使用序列,添加一个将是序列+年份的瞬态字段….

        4
  •  0
  •   K.Nicholas    7 年前

    粗略地看一下,我认为您不能将@generatedvalue与@idclass一起使用。

    Auto Increment not working for Entity class with composite Key