Hibernate создает два первичных ключа, когда я хочу только один - PullRequest
0 голосов
/ 08 января 2010

У меня есть класс Hibernate под названием Expression (здесь он упрощен для вашего удобства просмотра):

@Entity
public class Expression {
    @Id
    @GeneratedValue
    private long id;

    private String data;

    @OneToMany(fetch=FetchType.EAGER)
    @Cascade({CascadeType.MERGE, CascadeType.PERSIST})
    private Set<Expression> dependencies;
}

Это создает две таблицы, Expression(id, data) и Expression_Expression(expression_id, dependencies_id). Однако Hibernate устанавливает оба столбца expression_id и dependencies_id в качестве первичного ключа, поэтому у меня не может быть повторяющегося идентификатора dependencies_id, чего я и хотел бы.

Например, если у меня есть три выражения:

Expression x = new Expression("0");
Expression y = new Expression("1");
Expression z = new Expression("x + y");
Set<Expression> tmp = new HashSet<Expression>();
tmp.add(x);
tmp.add(y);
z.setDependencies(tmp);
// Persist x, y, and z.

, тогда Hibernate выполнит следующее:

Вставьте x в таблицу Expression с id = 1 и данными = "0"
Вставьте y в таблицу Expression с id = 2 и данными = "1"
Вставьте z в таблицу Expression с id = 3 и данными = "a + b"
Вставьте строку в таблицу 'Expression_Expression' с expression_id = 3 и dependencies_id = 1. (Делая z зависимым от x.)

Но когда он пытается вставить строку в таблицу Expression_Expression с expression_id = 3 и dependencies_id = 2 (превращая z в зависимую от y), я получаю ошибку повторяющейся записи.

Я бы хотел иметь несколько строк в таблице Expression_Expression с одним и тем же значением expression_id.

Любая помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 08 января 2010

Здесь следует использовать отношение @ManyToMany

...