Multi-Column Join in Hibernate/JPA Annotations

前端 未结 3 1838
温柔的废话
温柔的废话 2020-12-24 02:30

I have two entities which I would like to join through multiple columns. These columns are shared by an @Embeddable object that is shared by both entities. In t

3条回答
  •  悲哀的现实
    2020-12-24 02:48

    If this doesn't work I'm out of ideas. This way you get the 4 columns in both tables (as Bar owns them and Foo uses them to reference Bar) and the generated IDs in both entities. The set of 4 columns has to be unique in Bar so the many-to-one relation doesn't become a many-to-many.

    @Embeddable
    public class AnEmbeddedObject
    {
        @Column(name = "column_1")
        private Long column1;
        @Column(name = "column_2")
        private Long column2;
        @Column(name = "column_3")
        private Long column3;
        @Column(name = "column_4")
        private Long column4;
    }
    
    @Entity
    public class Foo
    {
        @Id
        @Column(name = "id")
        @GeneratedValue(generator = "seqGen")
        @SequenceGenerator(name = "seqGen", sequenceName = "FOO_ID_SEQ", allocationSize = 1)
        private Long id;
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({
            @JoinColumn(name = "column_1", referencedColumnName = "column_1"),
            @JoinColumn(name = "column_2", referencedColumnName = "column_2"),
            @JoinColumn(name = "column_3", referencedColumnName = "column_3"),
            @JoinColumn(name = "column_4", referencedColumnName = "column_4")
        })
        private Bar bar;
    }
    
    @Entity
    @Table(uniqueConstraints = @UniqueConstraint(columnNames = {
        "column_1",
        "column_2",
        "column_3",
        "column_4"
    }))
    public class Bar
    {
        @Id
        @Column(name = "id")
        @GeneratedValue(generator = "seqGen")
        @SequenceGenerator(name = "seqGen", sequenceName = "BAR_ID_SEQ", allocationSize = 1)
        private Long id;
        @Embedded
        private AnEmbeddedObject anEmbeddedObject;
    }
    

提交回复
热议问题