2015-06-01 1 views
0

Я делаю проект Spring Boot и использую spring-boot-jpa (реализация Hibernate). У меня возникли проблемы с настройкой следующего отношения между объектами.JPA много-к-одному с постоянными значениями в ссылочной таблице

Давайте предположим, что мне нужно много-к-одному (и reversly один-ко-многим) связь между двумя таблицами (MySQL в этом примере, table1 логически хранит описание кодов в различных других таблицах):

CREATE TABLE `table1` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `ref_table` VARCHAR(50) NOT NULL, 
    `ref_column` VARCHAR(50) NOT NULL, 
    `code` VARCHAR(10) NOT NULL, 
    `description` VARCHAR(100) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `u_composite1` (`ref_table` ASC, `ref_column` ASC, `code` ASC)); 

CREATE TABLE `table2` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `field1` VARCHAR(100) NULL, 
    `code` VARCHAR(10) NOT NULL, 
    PRIMARY KEY (`id`)); 

как я соединить эти две таблицы в SQL, как это:

SELECT t2.*, t1.description 
FROM table2 t2 
JOIN table1 t1 
    ON (t1.ref_table = 'table2' 
     AND t1.ref_column = 'code' 
     AND t1.code = t2.code); 

Итак, я создал объекты, как это (минус добытчиками сеттеры):

@Entity 
@Table(name = "table1") 
public class Table1 implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(unique = true, nullable = false) 
    private int id; 

    @Column(nullable = false, length = 10) 
    private String code; 

    @Column(length = 100) 
    private String description; 

    @Column(name = "ref_column", nullable = false, length = 50) 
    private String refColumn; 

    @Column(name = "ref_table", nullable = false, length = 50) 
    private String refTable; 

    @OneToMany(mappedBy = "table1") 
    private List<Table2> table2; 
} 

@Entity 
@Table(name = "table2") 
public class Table2 implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(unique = true, nullable = false) 
    private int id; 

    @Column(nullable = false, length = 45) 
    private String field1; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @Column(name = "code") 
    @JoinColumns({ 
     @JoinColumn(name = "code", referencedColumnName = "code", nullable = false, updatable = false), 
     @JoinColumn(name = "'table2'", referencedColumnName = "ref_table", nullable = false, updatable = false), 
     @JoinColumn(name = "'code'", referencedColumnName = "ref_column", nullable = false, updatable = false) 
    }) 
    private Table1 table1; 

} 

Но это не сработает. :(

Может ли этот вид связи даже определяется в JPA? Если это так, пожалуйста, как?

ответ

0

Относящийся к проблеме «присоединиться с постоянными значениями» мне удалось заставить его работать, используя @Where Hibernate аннотация:

  • How to replace a @JoinColumn with a hardcoded value?

    @Entity 
    @Table(name = "a") 
    public class A { 
        @Id 
        @GeneratedValue(strategy = GenerationType.AUTO) 
        public long id; 
    
        @OneToMany 
        @JoinColumn(name = "id", referencedColumnName = "id") 
        @Where(clause = "blah = 'CONSTANT_VALUE'") 
        public Set<B> b; 
    
        protected A() {} 
    } 
    
    @Entity 
    @Table(name = "b") 
    public class B { 
        @Id 
        @Column(nullable = false) 
        public Long id; 
    
        @Column(nullable = false) 
        public String blah; 
    
        protected B() {} 
    } 
    
Смежные вопросы