Гибернация отношения многие ко многим с использованием неидентифицирующего атрибута для столбца соединения - PullRequest
0 голосов
/ 17 февраля 2011

Возможно ли создать отношение «многие ко многим» в 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    |                |
+-------------+------------------+------+-----+---------+----------------+

1 Ответ

0 голосов
/ 17 февраля 2011

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

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

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