Спящий режим отношения «многие ко многим» с использованием атрибута без идентификатора для столбца соединения

Можно ли создать отношение «многие ко многим» в Hibernate с помощью аннотаций, если один из столбцов соединения не является атрибутом идентификатора для этого объекта? Родительский объект имеет два разных уникальных атрибута, и я хотел бы иметь возможность использовать любой из них в качестве столбца соединения, но я боюсь, что Hibernate может этого не допустить.

В MySQL это похоже на создание ограничения внешнего ключа, которое ссылается на уникальный столбец в родительской таблице, но не на первичный ключ.

В моей базе данных MySQL у меня есть таблица соединений с двумя разными отношениями внешнего ключа к одной из родительских таблиц. Это было сделано для поддержки двух наборов кода с одной и той же таблицей базы данных, и я пытаюсь обновить старый объект, чтобы использовать новые сопоставления, чтобы я мог отказаться от поддержки одного из внешних ключей в таблице соединения.

Я прочитал документацию и не смог найти ничего ясного о том, поддерживается ли это или нет. Мы будем очень признательны за любое понимание.

Спасибо!

Вот классы Java (упрощенные для этого вопроса, поэтому извините за любые опечатки):

@Entity
@Table(name="TAG")
@org.hibernate.annotations.Table(appliesTo = "TAG")
public class Tag implements Externalizable {
    private Long id;
    private String name;

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "TAG_ID", unique = true)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Id
    @Column(name = "NAME", unique = true)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        name = name.toLowerCase();
        this.name = name;
    }

}


@Entity
@Table(name="ITEM")
@org.hibernate.annotations.Table(appliesTo = "ITEM")
public class Item implements Externalizable {
    private Long id;
    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ITEM_ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        name = name.toLowerCase();
        this.name = name;
    }

    //tag support
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @Fetch(value = FetchMode.SELECT)
    @JoinTable(name = "ITEM_TAG", joinColumns = {@JoinColumn(name = "ITEM_ID")}, inverseJoinColumns = @JoinColumn(name = "TAG_NAME", referencedColumnName="NAME"))
    @OrderBy("name")
    public Set<Tag> getTags() {
        return tags;
    }

    public void setTags(Set<Tag> tags) {
        this.tags = tags;
    }
}

Вот определения таблиц MySQL (упрощенные для этого вопроса):

mysql> desc tag;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| tag_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255)     | NO   | UNI | NULL    |                |
+--------+------------------+------+-----+---------+----------------+

mysql> desc item;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| item_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255)     | NO   |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+

mysql> desc item_tag;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| item_tag_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| item_id     | int(10) unsigned | NO   | MUL | NULL    |                |
| tag_id      | int(10) unsigned | NO   | MUL | NULL    |                |
| tag_name    | varchar(255)     | NO   | MUL | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

person Ike Walker    schedule 17.02.2011    source источник


Ответы (1)


Вы можете сделать это, но вам нужно будет установить отношения только для чтения, поскольку спящий режим не настолько умен, чтобы знать, как заполнить таблицу item_tag.

Я не думаю, что ваше текущее сопоставление будет работать, потому что у вас есть каскад в Item. Если вам нужна дополнительная информация, дайте мне знать, и я могу попытаться собрать образец сопоставления.

person Augusto    schedule 17.02.2011
comment
Спасибо. Я, вероятно, могу избавиться от каскада все. Как сделать отношения доступными только для чтения? - person Ike Walker; 17.02.2011