Hibernate: Как объединить атрибут с условием, используя третью таблицу - PullRequest
1 голос
/ 19 марта 2019

У меня есть следующие таблицы ...

Object1
-------
id
...

Object2
-------
id
...

AttributeValue      
--------------      
id                  
attribute_id        
object_id  
value         

Attribute    
---------    
id           
name         
type         

... и классы сущностей

@Entity
@Table(name = "Attribute")
public class Attribute {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "type")
    private String type;
}


@Entity
@Table(name = "AttributeValue")
public class AttributeValue {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "attribute_id")
    private Long attributeId;

    @Column(name = "object_id")
    private Long objectId;

    @Column(name = "value")
    private String value;
}


@Entity
@Table(name = "Object1")
public class Object1 {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // ...    

    // how to annotate to get all matching attribute values?
    private Set<AttributeValue> values;
}

Я хочу, чтобы hibernate заполнил переменную экземпляра values всеми AttributeValue с соответствующими object_id и типом атрибута object1.

Если бы речь шла только о критерии object_id, я бы написал, например,

@JoinColumn(insertable = false, updatable = false, name = "object_id")
private Set<AttributeValue> values;

Но в этом случае будут заполнены также значения типа object2 и т. Д.

Итак, мой вопрос: выражается ли эта семантика в Hibernate и если да, то как?

РЕДАКТИРОВАТЬ: Я хочу подчеркнуть, что цель состоит в том, чтобы иметь несколько объектов (здесь Object1, Object2, ... ObjectN), которые не имеют общей иерархии, но все они имеют свойство атрибутов . Атрибуты для всех объектов будут находиться в одной таблице, различаемой каким-то типом дискриминатора (здесь, например, type).

1 Ответ

0 голосов
/ 20 марта 2019

Я думаю, что объект должен быть:

@Entity
@Table(name = "AttributeValue")
public class AttributeValue {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "attribute_id")
    private Long attributeId;

    @ManyToOne
    @JoinColumn(name="object_id", nullable=false)
    private Object1 object1;

    @Column(name = "value")
    private String value;
}


@Entity
@Table(name = "Object1")
public class Object1 {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="object1")
    private Set<AttributeValue> values;
}

Hibernate будет генерировать только столбец object_id в таблице AttributeValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...